[英]What is range/v3/functional/comparisons.hpp 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
的优势是什么? 仅在实例化 class 的 object 时保存<>
,即编写ranges::equal_to{}
而不是std::equal_to<>{}
?
ranges::equal_to
比std::equal_to
有什么优势? 仅在实例化其 class 的 object 时保存<>
,即写入ranges::equal_to{}
而不是std::equal_to<>{}
?
这是不正确的,因为从 C++17 开始就允许省略空的<>
。
什么是
range/[...]/comparisons.hpp
?
ranges::
comparison function 对象和基本版本之间的主要区别在于,由于要求equality_comparable_with<T, U>
, ranges
版本受到更多限制。 同样的区别也适用于std::
版本和 C++20 std::ranges::
版本。
要使std::equal_to{}(a, b)
成为有效代码,您只需要a == b
成为有效代码。
但是, ranges::equal_to{}(a, b)
成为有效代码, a
和b
必须满足equality_comparable
要求。 这意味着不仅a == b
需要有效, a
和b
之间的所有相等性检查也必须是有效代码(包括自我比较),其中包括:
a == a;
a != a;
b == b;
b != b;
a == b;
a != b;
b == a;
b != a;
同时, a
和b
之间也必须有一个公共类型C
,其中c == c
和c != c
都是有效代码。
在其他ranges::
comparison function 对象上可以观察到类似的行为,例如ranges::not_equal_to
和ranges::less
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.