Я надеялся, что кто-то может уточнить, что именно подразумевается под undefined поведением в 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;
};
Если я правильно понял, два Const_Casts к обоим ссылке, так и указатель в следующем коде удаляют Const-Ness исходного объекта типа FO, но любые попытки изменить это объект через указатель или ссылку приведет к неопределенному поведению.
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-Cystric, может привести к созданию Const_Cast, не может возникнуть без замечания, например:
Foo& rAnotherFoo = (Foo&)MyConstFoo;
Foo* pAnotherFoo = (Foo*)&MyConstFoo;
rAnotherFoo->SetValue(4);
pAnotherFoo->SetValue(5);
в каких обстоятельствах Это поведение вызывает фатальную ошибку времени выполнения? Есть ли настройка компилятора, которую я могу установить, чтобы предупредить меня от этого (потенциально) опасного поведения?
NB: I использую MSVC2008.