C++ std::less如何工作?

C++ std::less如何工作?,c++,c++11,stl,relational,partial-ordering,C++,C++11,Stl,Relational,Partial Ordering,指针关系运算符不定义总顺序(): 如果同一类型的两个指针p和q指向不同的对象,而这些对象不是同一对象或同一数组元素的成员,或者指向不同的函数,或者如果其中只有一个指针为空,则pq的结果是未指定的 文件说: 对于任何指针类型,std::less的部分专门化都会产生一个总的顺序,即使内置的运算符

指针关系运算符不定义总顺序():

如果同一类型的两个指针
p
q
指向不同的对象,而这些对象不是同一对象或同一数组元素的成员,或者指向不同的函数,或者如果其中只有一个指针为空,则
pq
的结果是未指定的

文件说:

对于任何指针类型,
std::less
的部分专门化都会产生一个总的顺序,即使内置的
运算符decltype(std::forward(uu t)
它是如何从偏序得到这个总序的

标准很少提到应该如何完成某件事。相反,它说明了需要什么。事实就是这样。本标准要求
std::less
提供总订单,见§20.9.6/14:

对于模板“大”、“小”、“大”和“小”,任何指针类型的专门化都会产生一个总顺序,即使内置运算符“=不”


虽然
操作员感谢您,但您的答案是完美的。但是,您是否知道
operator@rom1v我不知道有这样的实施。考虑到标准委员会如何谨慎地决定什么是要求,什么是未指明的行为,我很确定它是存在的。我不确定它是否仍然存在。这其中很大一部分来自远近指针时代。可能是为了适应在旧的“实”模式下运行的x86处理器的分段内存(请参阅)
  template<typename _Tp = void>
    struct less;

  template<typename _Tp>
    struct less : public binary_function<_Tp, _Tp, bool>
    {
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x < __y; }
    };

  template<>
    struct less<void>
    {
      template <typename _Tp, typename _Up>
        auto
        operator()(_Tp&& __t, _Up&& __u) const
        noexcept(noexcept(std::forward<_Tp>(__t) < std::forward<_Up>(__u)))
        -> decltype(std::forward<_Tp>(__t) < std::forward<_Up>(__u))
        { return std::forward<_Tp>(__t) < std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };