当模板参数要求 std::less 时,编译器如何在 std::set 中使用 T::operator<<T>?

  • 本文关键字:std set operator 参数 less 编译器 c++
  • 更新时间 :
  • 英文 :


创建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>

相关内容

最新更新