9

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

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

std::less文档说:

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

它如何从部分订单中产生这个全订单?


我无法通过查看定义来回答这个/usr/include/c++/4.9/bits/stl_function.h问题struct 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;
    };
4

1 回答 1

5

它如何从部分订单中产生这个全订单?

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

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

根据§5.9/4(您在问题中的引用)未指定whileoperator<在这方面的行为。

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

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

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

于 2015-06-03T10:36:16.537 回答