c++ range/v3/functional/comparations.hpp的作用是什么?

mzaanser  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(119)

什么是this header for
它定义了equal_to(仅给予一个例子):

namespace ranges
{
    /// \addtogroup group-functional
    /// @{
    struct equal_to
    {
        template(typename T, typename U)(
            /// \pre
            requires equality_comparable_with<T, U>)
        constexpr bool operator()(T && t, U && u) const
        {
            return (T &&) t == (U &&) u;
        }
        using is_transparent = void;
    };

    // ... and the others, such as !=, <, <=, ...
}

但是ranges::equal_to相对于std::equal_to的优势是什么呢?只有在示例化<>的类的对象时才保存<>,即写ranges::equal_to{}而不是std::equal_to<>{}

gwbalxhn

gwbalxhn1#

ranges::equal_to相对于std::equal_to的优势是什么?只有在示例化<>类的对象时才保存<>,即写ranges::equal_to{}而不是std::equal_to<>{}
这是不正确的,因为省略空的<>从C17开始就被允许了。
range/[...]/comparisons.hpp是做什么用的?
ranges::比较函数对象和基本版本之间的主要区别在于ranges版本由于equality_comparable_with<T, U>的要求而受到更多的限制。同样的区别也适用于和std::版本和C
20 std::ranges::版本。
要使std::equal_to{}(a, b)成为有效代码,您所需要的只是a == b成为有效代码。
但是,要使ranges::equal_to{}(a, b)成为有效代码,ab必须满足equality_comparable要求。这意味着不仅a == b需要有效,ab之间的所有相等性检查也必须是有效代码(包括自比较),包括:

a == a;
a != a;
b == b;
b != b;
a == b;
a != b;
b == a;
b != a;

同时,在ab之间还必须存在公共类型C,其中c == cc != c都是有效代码。
在其他ranges::比较函数对象(如ranges::not_equal_toranges::less)上可以观察到类似的行为。

相关问题