void hoge() { const Hage* obj = GetHage(); // const Hage* を返す関数 obj->Nukege(); // Hage::Nukegeはconstメソッドではない! }
BCCでは上記のようなコードは警告となり、エラーにはなってくれません。つまり、Hageオブジェクトはconstであるのにも関わらず、Nukegeの中でHageクラスのメンバである毛は無情にも抜けてしまうのです。
ヘルプには次のように書いてありました。
(これはエラーですが,既存のプログラムを動作させられるように,警告として出力されます。)
せめてコンパイルオプションでエラーになるかどうかの切り替えができるようにしてほしいです。使う側で気をつければいいだけなんですが、やっぱり気持ち悪い。
ちなみに上のコードが通るとなぜまずいのかというと:
struct data { // メンバはSetterを通さないと変更できない void SetNum(int num) { m_num = num; } private: int m_num; }; void hoge(const data& d) // ここではdataは参照するだけにしたいのでconst付き { d.SetNum(1111); // しかし、変更できてしまう... #if 0 d.m_num = 111; // 仮にメンバ変数がpublicだとしても、アクセスはできても // 変更はできないのでこっちはコンパイルエラーになってくれる #endif }
この例だと値渡しにするという逃げ道があるので、あまりいい例ではないかもしれませんが。
これは知ってた方が良いだろうし、改変して周りの人に配ろうかな。