std::compare_three_way
来自cppreference.com
| 在标头 <compare> 定义
|
||
| 在标头 <functional> 定义
|
||
| |
(C++20 起) | |
进行比较的函数对象。推导函数调用运算符的形参类型与返回类型。
嵌套类型
| 嵌套类型 | 定义 |
is_transparent
|
未指定 |
成员函数
operator() |
获得两个实参的三路比较结果 (公开成员函数) |
std::compare_three_way::operator()
| |
||
给定表达式 std::forward<T>(t) <=> std::forward<U>(u) 为 expr:
- 在由实现定义的指针严格全序中比较转换后的两个(
P类型)指针:
- 如果
t先于u,那么返回 std::strong_ordering::less。 - 如果
u先于t,那么返回 std::strong_ordering::greater。 - 否则返回 std::strong_ordering::equal。
- 如果
- 如果从
T到P的转换序列或从U到P的转换序列没有保持相等性,那么行为未定义。
- 在由实现定义的指针严格全序中比较转换后的两个(
- 否则:
- 返回
expr的结果。 - 如果没有实现
std::three_way_comparable_with<T, U>,那么行为未定义。
- 返回
此重载只有在满足 std::three_way_comparable_with<T, U> 时才会参与重载决议。
示例
运行此代码
#include <compare>
#include <iostream>
struct Rational
{
int num;
int den; // > 0
// 虽然可以用 X <=> Y 进行比较,但是直接调用
// std::compare_three_way{}(X, Y) 需要先定义 operator==
// 以满足 std::three_way_comparable_with。
constexpr bool operator==(Rational const&) const = default;
};
constexpr std::weak_ordering operator<=>(Rational lhs, Rational rhs)
{
return lhs.num * rhs.den <=> rhs.num * lhs.den;
}
void print(std::weak_ordering value)
{
value < 0 ? std::cout << "小于\n" :
value > 0 ? std::cout << "大于\n" :
std::cout << "等于\n";
}
int main()
{
Rational a{6, 5};
Rational b{8, 7};
print(a <=> b);
print(std::compare_three_way{}(a, b));
}
输出:
大于
大于
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 3530 | C++20 | 在比较指针时放松了语法检查 | 仅放松语义要求 |
参阅
(C++20) |
实现 x == y 的受约束函数对象 (类) |
(C++20) |
实现 x != y 的受约束函数对象 (类) |
(C++20) |
实现 x < y 的受约束函数对象 (类) |
(C++20) |
实现 x > y 的受约束函数对象 (类) |
(C++20) |
实现 x <= y 的受约束函数对象 (类) |
(C++20) |
实现 x >= y 的受约束函数对象 (类) |