EN JP CN

CL.ASSIGN.RETURN_CONST

CL.ASSIGN.RETURN_CONST

代入演算子 = で返される定数オブジェクト

これは、代入演算子のパラメータータイプの選択で、制約がある、または上手くない可能性を通知するクラスレベル (CL) のチェッカーです。クラスレベルのチェッカーは有効な C++ のための Scott Meyer 規則クラス構築に基づいて推奨を通知します。

CL.ASSIGN.RETURN_CONST チェッカーは、定数参照を返す代入演算子を含むクラスを検出します。このような戻り値の型が使用されると、言語構築によっては表現できない場合があります。これらの言語構築が望ましいかそうでないかは議論の余地がありますが、以下の基本テンプレートに従えば、型によらずに言語の一貫性を維持できることが保証されます。

  class MyClass {
  public:
    MyClass& operator=(const MyClass&);
  };

脆弱性とリスク

この設計では脆弱になることはありませんが、精通していないプログラマーが、"動作はする" が互換性のない言語構築を使用しようと試みて、(C++ コンパイラ出力の通常の複雑度の) ほとんど意味のないコンパイラからの警告に直面するリスクはあります。

脆弱コード例

     
1    class C {
2    public:
3      const C& operator=(const C& rhs); // const return type
...
4    }; 
5
6    void foo(const C& tmpl) {
7      C obj;
8      (obj = tmpl).someNonConstMethod();
9    }

この例では、Klocwork は 3 行目について CL.ASSIGN.RETURN_CONST エラーをレポートします。この設計の結果はコンパイラエラーになり、8 行目のクラス 'C' 内での代入演算子の使用が間違いであると指摘されます。Klocwork の警告に基づいてコードを見直せば、戻り値の型で制約される設計を回避することができます。

修正コード例

     
1    class C {
2    public:
3      C& operator=(const C& rhs); 
... 
4    };
5
6    bool foo(const C& tmpl) { 
7      C obj;
8      (obj = tmpl).someNonConstMethod();
9    }

修正したコード例では、3 行目で代入演算子の標準テンプレートを使用し、8 行目での代入演算子の使用が期待どおりに動作することを確実にしています。