で2017年11月11日、ISO C ++委員会が採択し ハーブサッターのための提案<=> 『宇宙船』 3ウェイ比較演算子をに追加された新機能の一つとして、C ++ 20。「一貫性のある比較」というタイトルの論文で、Sutter、Maurer、およびBrownは新しいデザインの概念を示しています。提案の概要については、記事からの抜粋を以下に示します。
式<=> bが比較対象返す<0の場合は<Bを、比較> 0の場合、B> 、及び比較== 0とbが等しい/等しい場合。
一般的なケース:タイプXとタイプYのすべての比較をメンバーごとのセマンティクスで書き込むには、次のように記述します。
auto X::operator<=>(const Y&) =default;
高度なケース:タイプXとタイプYのすべての比較を書き込むには、Yを受け取るoperator <=>を書き込み、必要に応じて= defaultを使用
してメンバーごとのセマンティクスを取得し、適切なカテゴリタイプを返します。
- タイプが自然に<をサポートしている場合は_orderingを返します。対称<、>、<=、> =、==、
!=を効率的に生成します。それ以外の場合は_equalityを返し、対称的な==および!=を効率的に生成します。
- あなたのタイプのa == bがf(a)== f(b)を意味する場合はstrong_を返します(代替可能性、fはパブリックconstメンバーを使用してアクセス可能な比較重視の状態のみを読み取ります)、そうでない場合はweak_を返し
ます。
比較カテゴリ
5つの比較カテゴリがstd::
タイプとして定義され、それぞれに次の定義済みの値があります。
+--------------------------------------------------------------------+
| | Numeric values | Non-numeric |
| Category +-----------------------------------+ |
| | -1 | 0 | +1 | values |
+------------------+------+------------+---------------+-------------+
| strong_ordering | less | equal | greater | |
| weak_ordering | less | equivalent | greater | |
| partial_ordering | less | equivalent | greater | unordered |
| strong_equality | | equal | nonequal | |
| weak_equality | | equivalent | nonequivalent | |
+------------------+------+------------+---------------+-------------+
これらのタイプ間の暗黙的な変換は、次のように定義されています。
strong_ordering
値が{ 、、}のless
場合equal
、greater
暗黙的に次のように変換されます:
weak_ordering
値を{ less
、equivalent
、greater
}
partial_ordering
値を{ less
、equivalent
、greater
}
strong_equality
値を{ unequal
、equal
、unequal
}
weak_equality
値を{ nonequivalent
、equivalent
、nonequivalent
}
weak_ordering
値が{ 、、}のless
場合equivalent
、greater
暗黙的に次のように変換されます:
partial_ordering
値を{ less
、equivalent
、greater
}
weak_equality
値を{ nonequivalent
、equivalent
、nonequivalent
}
partial_ordering
値と{ less
、equivalent
、greater
、unordered
}暗黙的に変換します。
weak_equality
値を{ nonequivalent
、equivalent
、nonequivalent
、nonequivalent
}
strong_equality
値が{ equal
、unequal
}の場合、暗黙的に次のように変換されます:
weak_equality
値{ equivalent
、nonequivalent
}
三者比較
<=>
トークンが導入されます。文字シーケンスは、古いソースコードではに<=>
トークン化され<= >
ます。たとえばX<&Y::operator<=>
、意味を保持するためにスペースを追加する必要があります。
オーバーロード可能な演算子<=>
は3者間比較関数であり、よりも優先順位が高く<
、低くなり<<
ます。リテラルと比較できる型を返しますが、0
式テンプレートをサポートするなど、他の戻り型も許可されます。<=>
言語および標準ライブラリで定義されたすべての演算子は、前述の5つのstd::
比較カテゴリタイプの1つを返します。
言語タイプについては、以下の組み込みの<=>
同じタイプの比較が提供されています。特に断りのない限り、すべてconstexprです。これらの比較は、スカラーの昇格/変換を使用して異種混合で呼び出すことはできません。
- 以下のために
bool
、一体型、およびポインタ型、<=>
戻りますstrong_ordering
。
- ポインター型の場合、さまざまなcv修飾と派生からベースへの変換で、同種組み込みを呼び出すことができ
<=>
、組み込み異種がありoperator<=>(T*, nullptr_t)
ます。同じオブジェクト/割り当てへのポインタの比較のみが定数式です。
- 基本的な浮動小数点型の場合、を
<=>
返しますpartial_ordering
。引数をより大きな浮動小数点型に拡張することにより、異種で呼び出すことができます。
- 列挙
<=>
型の場合、列挙型の基になる型と同じものを返します<=>
。
- の場合
nullptr_t
、<=>
戻り値はstrong_ordering
常に生成されequal
ます。
- コピー可能アレイに対して、
T[N] <=> T[N]
同じ型を返すT
の<=>
と行う辞書式要素ごとの比較。<=>
他のアレイにはありません。
- 以下のために
void
何もありません<=>
。
このオペレーターの内部の仕組みをよりよく理解するには、元の論文をお読みください。これは私が検索エンジンを使って見つけたものです。