创建std::set
时,其中一个模板参数为class Compare
,默认为std::less<T>
。
现在,即使你没有给出std::less<T>
的专门化,定义T::operator<
对于C++来说也足够好了;弄清楚";。但是C++并没有解决任何问题,编译器是。
编译器正在经历一系列我相信很简单的步骤。这些步骤是什么?
标准库的定义使得std::less<T>
将使用operator<
,除非另有专门化。因此,如果您不提供专门化,如果类型支持<
,那么它就会成功。
来自std::less<T>
:
用于执行比较的函数对象。除非专用,否则会在类型
T
上调用operator<
。
对于std::less<T>::operator()
:
可能的实现:
constexpr bool operator()(const T &lhs, const T &rhs) const
{
return lhs < rhs;
}
查看编译器定义的std::less<void>。
正如您所看到的,它只是返回lhs<rhs。
至于编译器如何知道绑定std::less<void>
而不是std::less<T>
,那是因为没有显式编写std::less<T>
的专门化。因此,当你要求它时,它必须自动生成。
那么,为什么编译器找到std::less<void>
而不是std::less<>
呢?这是因为当您不向std::less
传递模板参数时,您将得到std::less<void>
。