C ++の基本原則C.86:==セマンティックが例外をスローしないオペランドの規則の遵守を確保

C.86:オペランドの型とnoexceptに関してメイク==対称

C.86は:==セマンティックは、例外をスローしないオペランドの規則の遵守を確保します

 

 

理由(理由)

オペランドの非対称治療は驚くべき変換が可能なエラーの源である。==基本的な動作とプログラマは故障の恐れなしに使用することができるはずです。

 

 

 

 

非対称的な治療は、驚くべきオペランドになり、変換のタイプがあるとしたときにエラーの原因が発生する可能性があります。==それは基本的な操作であり、プログラマが失敗を恐れずにそれを使用することができるはずです。

 

 

 

実施例(実施例)

 

struct X {
    string name;
    int number;
};

bool operator==(const X& a, const X& b) noexcept {
    return a.name == b.name && a.number == b.number;
}

 

 

例えば、悪い(陰性試料)

 

class B {
    string name;
    int number;
    bool operator==(const B& a) const {
        return name == a.name && number == a.number;
    }
    // ...
};

Bの比較は、2番目のオペランドの変換を受け入れますが、その最初ではありません。

B比較演算子に許容される型変換第二オペランドが、我々は変換パラメータの第一のタイプを受け入れることができません。

 

 

 

Note(注意)

 

クラスは、障害状態を持っている場合は、ダブルのNaNのように、障害状態の投げとの比較をする誘惑があります。代替は、2つの障害状態が等しいとし、任意の有効な状態が障害状態に対する偽比較することです。

クラスがNaN倍精度数などの故障状態を持っている場合は、そのオブジェクトの比較で誘惑し、失敗した状態がスローされ生成されます。別のオプションは、2つの失敗した状態の結果が等しいと見なされ等しいと考えられていないアクティブおよび非アクティブ状態の比較結果を比較することです。(例外をスローせずに、翻訳者注)

 

 

 

Note(注意)

 

このルールは、すべての通常の比較演算子に適用されます!=、<、<=、>、および> =。

同じルールは通常の比較演算子にも適用することが:! =、<、<=、>、そして> =。

 

 

施行(提案)

 

  • 引数の型が異なるため、フラグ演算子==()。他の比較演算子のために同じ:!=、<、<=、>、および> =。

    パラメータは、オペレータの他のタイプと同じである場合は、プロンプト。その他の比較演算子、あまりに:! =、<、<=、>、そして> =。

  • フラグ部材演算子==()S。他の比較演算子のために同じ:!=、<、<=、>、および> =。

    マーキングメンバ関数の比較演算子、その他の比較演算子、あまりに:! =、<、<=、>、そして> =。

 

 

説明リンク

 

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c86-make--symmetric-with-respect-to-operand-types-and-noexcept

 


 

私はこの記事は参考になりましだと思いますか?ようこそ親指アップし、より多くの人と共有することができます。

より多くの更新の記事を読む、オブジェクト指向の考え方のマイクロチャンネル公衆数にしてください注意を払います[]

公開された408元の記事 ウォンの賞賛653 ビュー290 000 +

おすすめ

転載: blog.csdn.net/craftsman1970/article/details/104905003