什么是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<>{}
?
1条答案
按热度按时间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::
版本和C20std::ranges::
版本。要使
std::equal_to{}(a, b)
成为有效代码,您所需要的只是a == b
成为有效代码。但是,要使
ranges::equal_to{}(a, b)
成为有效代码,a
和b
必须满足equality_comparable
要求。这意味着不仅a == b
需要有效,a
和b
之间的所有相等性检查也必须是有效代码(包括自比较),包括:同时,在
a
和b
之间还必须存在公共类型C
,其中c == c
和c != c
都是有效代码。在其他
ranges::
比较函数对象(如ranges::not_equal_to
和ranges::less
)上可以观察到类似的行为。