Arantium Maestum

プログラミング、囲碁、読書の話題

Effective C++勉強メモ: Item 6 コンパイラのお節介にノーという方法

前回の項目から続いて、コンパイラが勝手に書いてくれるメンバ関数がお節介だったら?という話。

特にcopy assignmentなどはいらない、うっかりどこかでcopy assignするような処理を書いてしまったらちゃんと静的にエラーが検出されてほしい、というような時。

自分で記述しないだけではコンパイラに自動作成されてしまう。

じゃあ自分で記述するけど、処理はなしでprivateにしてしまえば?

これだけで大抵のケースは大丈夫だけど、オブジェクト自体のメンバ関数やフレンドからは呼び出せる。

じゃあ宣言だけして定義しなければ?オブジェクト自体のメンバ関数やフレンドから使おうとするとリンクエラーになる。ただ、コンパイラは通ってしまうので、コンパイルに時間が掛かるコードベースなどだと延々とコンパイルし終わってからエラーになる。できればコンパイルエラーにしたい。

Uncopyableというベースクラスを定義し、copy constructorやcopy assignment operatorをprivateとして宣言する。そのベースクラスから継承すれば、copyしようとすればコンパイルエラーになる。万歳。