Неопределенное поведение с Const_Cast

Я надеялся, что кто-то может уточнить, что именно подразумевается под 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.

9
задан Munro 8 September 2011 в 14:21
поделиться