質問: C++ において、 std::set など生成・解放が重いオブジェクトをconstつきで関数に渡すとき、参照にし忘れることがあります。これをチェックするような既存のコードレビューツールやコンパイラオプション(いまはGCC 7.3 を使っています)は何かないのでしょうか? 気を付けていてもコードレビューで注意されることが多いため、困っています。 * 「自分で気を付ける」以外の回答を望みますが、現状それしか手段がない場合も、それを教えてください。 * 何か理由があってそのような既存のツールがない、という場合も、その理由を教えて下さると参考になります。
回答: コピーコンストラクタ(と代入オペレータ)を消すのが確実です。 たとえば `std::set` をコピーしたくないなら、`std::set`を継承したクラスを定義して、コピーコンストラクタと`operator=`を消します。 ``` class IntSet : public std::set { public: IntSet(); // 必要に応じて他のコンストラクタも定義 IntSet(const IntSet&) = delete; IntSet& operator=(const IntSet&) = delete; }; ``` これで、参照ではない引数のためにインスタンスのコピーが必要になると、コンパイルエラーになります。 意図的にコピーする必要が出てきた場合は、`IntSet clone() const` のようなメンバ関数を足します。