ホームページ バックエンド開発 C++ C 20 のカスタム宇宙船オペレーターが自動等価比較を妨げるのはなぜですか?

C 20 のカスタム宇宙船オペレーターが自動等価比較を妨げるのはなぜですか?

Nov 07, 2024 pm 03:05 PM

Why Does a Custom Spaceship Operator in C  20 Prevent Automatic Equality Comparison?

宇宙船演算子と同等性の比較

C 20 宇宙船演算子 (<=> としても知られる) には、便利で簡潔な構文が導入されています値を比較するため。ただし、特定のシナリオでは、予期される等価演算子および不等号演算子 (== および !=) が生成されない場合があります。この質問では、この動作と、カスタム宇宙船オペレーター実装がこれらの追加オペレーターの作成を妨げる理由について説明します。

問題の説明

宇宙船オペレーターがデフォルト実装の構造体で使用されています:

struct X
{
    int Dummy = 0;
    auto operator&lt;=&gt;(const X&amp; other) const = default; // Default implementation
};
ログイン後にコピー

このコードはエラーなしでコンパイルされます。ただし、カスタムの宇宙船演算子実装を定義する場合:

struct X
{
    int Dummy = 0;
    auto operator&lt;=&gt;(const X&amp; other) const
    {
        return Dummy &lt;=&gt; other.Dummy;
    }
};
ログイン後にコピー

等価演算子 (==) を使用しようとすると、コンパイラはエラーを発行します:

error C2676: binary '==': 'X' does not define this operator or a conversion to a type acceptable to the predefined operator
ログイン後にコピー

説明

この動作は、言語標準で定義されているように、意図的なものです。クラスにデフォルトの宇宙船演算子がある場合、コンパイラーは等価演算子のデフォルト実装を合成します。ただし、宇宙船演算子がカスタム定義で実装されている場合、コンパイラは等価演算子を自動的に生成しません。

この区別は、効率性への懸念から生じています。宇宙船演算子は、値の完全な順序付けを提供するように設計されていますが、等価演算子 (==) は、完全な比較を試みる前にサイズを比較するなどの最適化を実行できます。 std::vector のようなクラスの場合、等価比較に spaceship 演算子を使用することは、最も効率的なアプローチではない可能性があります。

等価演算子の実装をプログラマに任せることで、コンパイラは非一致を生成する可能性を回避します。 -最適な実装。したがって、クラスにデフォルトではない宇宙船演算子がある場合、開発者は等価演算子も明示的に定義する必要があります。

以上がC 20 のカスタム宇宙船オペレーターが自動等価比較を妨げるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか? C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか? Mar 03, 2025 pm 05:52 PM

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか?

c言語関数形式文字ケース変換手順 c言語関数形式文字ケース変換手順 Mar 03, 2025 pm 05:53 PM

c言語関数形式文字ケース変換手順

GULC:Cライブラリはゼロから構築されています GULC:Cライブラリはゼロから構築されています Mar 03, 2025 pm 05:46 PM

GULC:Cライブラリはゼロから構築されています

C言語関数の定義と呼び出しルールは何ですか、そして C言語関数の定義と呼び出しルールは何ですか、そして Mar 03, 2025 pm 05:53 PM

C言語関数の定義と呼び出しルールは何ですか、そして

明確な使用法とフレーズ共有 明確な使用法とフレーズ共有 Mar 03, 2025 pm 05:51 PM

明確な使用法とフレーズ共有

C標準テンプレートライブラリ(STL)はどのように機能しますか? C標準テンプレートライブラリ(STL)はどのように機能しますか? Mar 12, 2025 pm 04:50 PM

C標準テンプレートライブラリ(STL)はどのように機能しますか?

メモリに保存されているC言語関数の返品値はどこにありますか? メモリに保存されているC言語関数の返品値はどこにありますか? Mar 03, 2025 pm 05:51 PM

メモリに保存されているC言語関数の返品値はどこにありますか?

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか? STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか? Mar 12, 2025 pm 04:52 PM

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか?

See all articles