Tenía la esperanza de que alguien pudiera aclarar exactamente qué se entiende por comportamiento indefinido en C++. Dada la siguiente definición de clase:Comportamiento indefinido con const_cast
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;
};
Si he entendido bien los dos const_casts a la vez una referencia y un puntero en el código siguiente se eliminará el const-dad del objeto original de tipo Foo, pero cualquier intento hecho para modificar este objeto a través del puntero o la referencia dará como resultado un comportamiento indefinido.
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;
}
Lo que me es desconcertante es por qué esto parece funcionar y modificará el objeto constante original, pero ni siquiera me rápido con una advertencia para notificarme que este comportamiento no está definido. Sé que const_casts son, a grandes rasgos, mal visto, pero puedo imaginar un caso en el que se nota la falta de conciencia de que la conversión de estilo C puede resultar en una const_cast está hecho podría ocurrir sin, por ejemplo:
Foo& rAnotherFoo = (Foo&)MyConstFoo;
Foo* pAnotherFoo = (Foo*)&MyConstFoo;
rAnotherFoo->SetValue(4);
pAnotherFoo->SetValue(5);
¿En qué circunstancias podría este comportamiento causar un error de tiempo de ejecución fatal? ¿Hay alguna configuración del compilador que pueda configurar para advertirme sobre este comportamiento (potencialmente) peligroso?
NB: Yo uso MSVC2008.
posible duplicado de [¿Es este comportamiento indefinido const_cast?] (Http://stackoverflow.com/questions/5969867/is-this-const-cast-undefined-behavior) – spraff
Si está usando un molde de estilo C , cualquier compilador decente debería advertirte que estás "descartando calificadores". Asegúrate de habilitar siempre todas las advertencias. –
Demonios nasales. ¿Qué más? – PlasmaHH