`std :: less`是如何工作的?

rom*_*m1v 8 c++ stl relational partial-ordering c++11

指针关系运算符没有定义总顺序(C++ 11标准的第5.9节):

如果两个指针pq相同类型的点不属于相同对象的成员或相同数组的元素不同的对象或不同的功能,或者如果只有它们中的一个为空,结果p<q,p>q,p<=q,和p>=q未指定.

std :: less文档说:

std::less任何指针类型的部分特化都会产生一个总订单,即使内置的operator<没有.

如何从部分订单中获得此总订单?


我无法通过观察来回答这个问题/usr/include/c++/4.9/bits/stl_function.hstruct less定义:

  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;
    };
Run Code Online (Sandbox Code Playgroud)

Sho*_*hoe 5

它如何从偏序产生这个全序?

该标准很少说明应该如何完成某事。相反,它说明了需要什么。而事实正是如此。该标准要求std::less在 §20.9.6/14 中提供一个总订单:

对于模板greater、less、greater_equal 和less_equal,任何指针类型的特化都会产生一个全序,即使内置运算符<、>、<=、>= 没有。

operator<“在这方面的行为是不确定根据§5.9/ 4(你在你的问题有引号)。

未指定的行为在 §1.3.25 中定义为:

行为,对于格式良好的程序结构和正确的数据,这取决于实现 [...]

在你的具体实现中,operator<已经提供了一个全序(可能是因为你的指针类型被实现为 32 位或 64 位地址,可以很容易地解释为类似于无符号整数的东西,产生一个全序),因此std::less只需转发它的该运算符的参数。