C++ で未定義の動作が何を意味するのかを誰かが正確に明確にしてくれることを期待していました。次のクラス定義があるとします。
class Foo
{
public:
explicit Foo(int Value): m_Int(Value) { }
void SetValue(int Value) { m_Int = Value; }
private:
Foo(const Foo& rhs);
const Foo& operator=(const Foo& rhs);
private:
int m_Int;
};
私が正しく理解している場合、次のコードの参照とポインターの両方への 2 つの const_casts は、型 Foo の元のオブジェクトの const-ness を削除しますが、ポインターまたは参照のいずれかを介してこのオブジェクトを変更しようとすると、未定義の動作が発生します。
int main()
{
const Foo MyConstFoo(0);
Foo& rFoo = const_cast<Foo&>(MyConstFoo);
Foo* pFoo = const_cast<Foo*>(&MyConstFoo);
//MyConstFoo.SetValue(1); //Error as MyConstFoo is const
rFoo.SetValue(2); //Undefined behaviour
pFoo->SetValue(3); //Undefined behaviour
return 0;
}
私を困惑させているのは、これが機能しているように見え、元の const オブジェクトを変更するのに、この動作が未定義であることを通知する警告が表示されない理由です。大まかに言えば、const_casts が嫌われていることは知っていますが、C スタイルのキャストによって const_cast が作成される可能性があるという認識の欠如が、気付かれずに発生する可能性があることを想像できます。たとえば、次のようになります。
Foo& rAnotherFoo = (Foo&)MyConstFoo;
Foo* pAnotherFoo = (Foo*)&MyConstFoo;
rAnotherFoo->SetValue(4);
pAnotherFoo->SetValue(5);
この動作によって致命的な実行時エラーが発生する可能性があるのは、どのような状況ですか? この (潜在的に) 危険な動作を警告するために設定できるコンパイラ設定はありますか?
注意: MSVC2008 を使用しています。