operator==,!=,<,<=,>,>=,<=>(std::tuple)
定义在头文件 <tuple> 中 |
||
template< class... TTypes, class... UTypes > bool operator==( const std::tuple<TTypes...>& lhs, |
(1) | (自 C++11 起) (自 C++14 起为 constexpr) |
template< class... TTypes, class... UTypes > bool operator!=( const std::tuple<TTypes...>& lhs, |
(2) | (自 C++11 起) (自 C++14 起为 constexpr) (直到 C++20) |
template< class... TTypes, class... UTypes > bool operator<( const std::tuple<TTypes...>& lhs, |
(3) | (自 C++11 起) (自 C++14 起为 constexpr) (直到 C++20) |
template< class... TTypes, class... UTypes > bool operator<=( const std::tuple<TTypes...>& lhs, |
(4) | (自 C++11 起) (自 C++14 起为 constexpr) (直到 C++20) |
template< class... TTypes, class... UTypes > bool operator>( const std::tuple<TTypes...>& lhs, |
(5) | (自 C++11 起) (自 C++14 起为 constexpr) (直到 C++20) |
template< class... TTypes, class... UTypes > bool operator>=( const std::tuple<TTypes...>& lhs, |
(6) | (自 C++11 起) (自 C++14 起为 constexpr) (直到 C++20) |
template< class... TTypes, class... UTypes > constexpr std::common_comparison_category_t< |
(7) | (自 C++20 起) |
template< class... TTypes, tuple-like UTuple > constexpr bool operator==( const tuple<TTypes...>& lhs, const UTuple& rhs ); |
(8) | (自 C++23 起) |
template< class... TTypes, tuple-like UTuple > constexpr std::common_comparison_category_t< |
(9) | (自 C++23 起) |
如果 sizeof...(TTypes) 不等于 sizeof...(UTypes),或者对于任何在
[ 0, sizeof...(Types)) 范围内的 i,std::get<i>(lhs) == std::get<i>(rhs) 不是有效的表达式,程序将形成错误。 如果对于任何在 [ 0, sizeof...(Types)) 范围内的 i,std::get<i>(lhs) == std::get<i>(rhs) 的类型和值类别不满足 BooleanTestable 要求,则行为未定义。 |
(直到 C++26) |
只有当 sizeof...(TTypes) 等于 sizeof...(UTypes)、std::get<i>(lhs) == std::get<i>(rhs) 是一个有效的表达式,并且对于每个在 [ 0, sizeof...(Types)) 范围内的 i,decltype(std::get<i>(lhs) == std::get<i>(rhs)) 符合 boolean-testable 时,此重载才会参与重载解析。 |
(自 C++26 起) |
if (std::get<0>(lhs) < std::get<0>(rhs)) return true;
if (std::get<0>(rhs) < std::get<0>(lhs)) return false;
if (std::get<1>(lhs) < std::get<1>(rhs)) return true;
if (std::get<1>(rhs) < std::get<1>(lhs)) return false;
...
- 对于空元组,返回 std::strong_ordering::equal。
- 对于非空元组,其效果等效于
if (auto c =
synth-three-way(std::get<0>(lhs), std::get<0>(rhs)); c != 0) return c;
if (auto c =
synth-three-way(std::get<1>(lhs), std::get<1>(rhs)); c != 0) return c;
...
return
synth-three-way(std::get<N - 1>(lhs), std::get<N - 1>(rhs));
tuple-like
对象,并且 rhs 的元素数量由 std::tuple_size_v<UTuple> 确定。此重载只能通过 依赖于参数的查找 找到。tuple-like
对象。 /* Elems */ 表示类型包 std::tuple_element_t<i, UTuple>,对于每个在 [
0,
std::tuple_size_v<UTuple>)
范围内的 i,按升序排列。此重载只能通过 依赖于参数的查找 找到。所有比较运算符都是短路运算符;它们不会访问超出确定比较结果所需的元组元素。
|
(自 C++20 起) |
内容 |
[edit] 参数
lhs, rhs | - | 要比较的元组 |
[edit] 返回值
[
0,
sizeof...(Types))
中,否则 false。对于两个空元组,返回 true。[edit] 注释
关系运算符是根据每个元素的 operator< 定义的。 |
(直到 C++20) |
关系运算符是根据 synth-three-way 定义的,如果可能,它使用 operator<=>,否则使用 operator<。 值得注意的是,如果元素类型本身不提供 operator<=>,但可以隐式转换为三向可比较类型,则将使用该转换而不是 operator<。 |
(自 C++20 起) |
特性测试 宏 | 值 | Std | 特性 |
---|---|---|---|
__cpp_lib_constrained_equality |
202403L | (C++26) | 受限 operator== 用于 std::tuple |
[edit] 示例
由于为元组定义了 operator<,因此可以对元组容器进行排序。
#include <algorithm> #include <iostream> #include <tuple> #include <vector> int main() { std::vector<std::tuple<int, std::string, float>> v { {2, "baz", -0.1}, {2, "bar", 3.14}, {1, "foo", 10.1}, {2, "baz", -1.1}, }; std::sort(v.begin(), v.end()); for (const auto& p: v) std::cout << "{ " << get<0>(p) << ", " << get<1>(p) << ", " << get<2>(p) << " }\n"; }
输出
{ 1, foo, 10.1 } { 2, bar, 3.14 } { 2, baz, -1.1 } { 2, baz, -0.1 }
[edit] 缺陷报告
以下行为更改缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布的行为 | 正确的行为 |
---|---|---|---|
LWG 2114 (P2167R3) |
C++11 | 布尔运算的类型先决条件丢失 | 已添加 |
[edit] 另请参阅
(在 C++20 中移除)(在 C++20 中移除)(在 C++20 中移除)(在 C++20 中移除)(在 C++20 中移除)(C++20) |
按字典顺序比较 pair 中的值(函数模板) |