で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何もありません<=>。
このオペレーターの内部の仕組みをよりよく理解するには、元の論文をお読みください。これは私が検索エンジンを使って見つけたものです。