C++ において、 std::set
など生成・解放が重いオブジェクトをconstつきで関数に渡すとき、参照にし忘れることがあります。これをチェックするような既存のコードレビューツールやコンパイラオプション(いまはGCC
7.3 を使っています)は何かないのでしょうか？  
気を付けていてもコードレビューで注意されることが多いため、困っています。

  * 「自分で気を付ける」以外の回答を望みますが、現状それしか手段がない場合も、それを教えてください。
  * 何か理由があってそのような既存のツールがない、という場合も、その理由を教えて下さると参考になります。
CC BY-SA 4.0
2020-11-04T03:20:15.577
71709
2020-11-05T00:13:25.967
2020-11-04T03:39:37.003
42596
42596
question
c++ gcc compiler
C++ 生成・解放が重いオブジェクトをconstつきで関数に渡すときの参照渡しのチェック
コピーコンストラクタ(と代入オペレータ)を消すのが確実です。

たとえば `std::set<int>`
をコピーしたくないなら、`std::set<int>`を継承したクラスを定義して、コピーコンストラクタと`operator=`を消します。

```

    class IntSet : public std::set<int> {
    public:
      IntSet();
      // 必要に応じて他のコンストラクタも定義
    
      IntSet(const IntSet&) = delete;
      IntSet& operator=(const IntSet&) = delete;
    };
    
```

これで、参照ではない引数のためにインスタンスのコピーが必要になると、コンパイルエラーになります。

意図的にコピーする必要が出てきた場合は、`IntSet clone() const` のようなメンバ関数を足します。
CC BY-SA 4.0
2020-11-04T04:49:19.600
71711
2020-11-05T00:13:25.967
2020-11-05T00:13:25.967
3475
3475
71709
answer