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> によって決定される点が異なります。このオーバーロードは 引数依存の名前探索 (argument-dependent lookup) を介してのみ見つかります。tuple-like オブジェクトである点が異なります。/* Elems */ は、[0, std::tuple_size_v<UTuple>) 内の各 i に対する型パック std::tuple_element_t<i, UTuple> を昇順に示します。このオーバーロードは 引数依存の名前探索 (argument-dependent lookup) を介してのみ見つかります。すべての比較演算子は短絡評価されます。比較の結果を決定するために必要な範囲を超えてタプル要素にアクセスすることはありません。
|
|
(C++20以降) |
目次 |
[編集] パラメーター
| lhs, rhs | - | 比較するタプル |
[編集] 戻り値
[0, sizeof...(Types)) 内のすべての i について std::get<i>(lhs) == std::get<i>(rhs) であれば true、そうでなければ false。2つの空のタプルの場合は true を返します。[編集] 備考
|
関係演算子は、各要素の operator< を用いて定義されます。 |
(C++20まで) |
|
関係演算子はsynth-three-wayを介して定義されます。synth-three-wayは、可能であればoperator<=>を使用し、そうでなければoperator<を使用します。 特に、要素の型が operator<=> を提供しない場合でも、3方向比較可能な型に暗黙的に変換できる場合は、operator< の代わりにその変換が使用されます。 |
(C++20以降) |
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_constrained_equality |
202403L |
(C++26) | std::tuple の制約付き operator== |
[編集] 例
タプルには 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 }[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2114 (P2167R3) |
C++11 | ブール演算の型事前条件が不足していました | 追加された |
[編集] 関連項目
| (C++20で削除)(C++20で削除)(C++20で削除)(C++20で削除)(C++20で削除)(C++20) |
pair内の値を辞書式比較する(関数テンプレート) |