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