C++ 生成・解放が重いオブジェクトをconstつきで関数に渡すときの参照渡しのチェック


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

  * 「自分で気を付ける」以外の回答を望みますが、現状それしか手段がない場合も、それを教えてください。
  * 何か理由があってそのような既存のツールがない、という場合も、その理由を教えて下さると参考になります。




コピーコンストラクタ(と代入オペレータ)を消すのが確実です。

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

[code]

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

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

意図的にコピーする必要が出てきた場合は、`IntSet clone() const` のようなメンバ関数を足します。

