C++ 11 §12.1/14:Construcción de objeto const
Durante la construcción de un objeto const, si se accede al valor del objeto o cualquiera de sus subobjetos a través de un lvalue que no es obtenido, directa o indirectamente, del constructor este puntero, el valor del objeto o subobjeto así obtenido es no especificado. [Ejemplo:
struct C;
void no_opt(C*);
struct C {
int c;
C() : c(0) { no_opt(this); }
};
const C cobj;
void no_opt(C* cptr) {
// value of cobj.c is unspecified
int i = cobj.c * 100;
cptr->c = 1;
// value of cobj.c is unspecified
cout << cobj.c * 100 << '\n';
}
Compilar el ejemplo anterior da salida 100
. Mi pregunta es por qué el valor de cobj.c
no debe especificarse cuando la lista de inicialización lo establece en 0
antes de ingresar al constructor. ¿Cómo es este comportamiento diferente en caso de que se use un objeto no const?
Me gustaría señalar que en el ejemplo anterior 'cobj.Se accede a c' antes de que 'cobj' esté completamente construido. Me parece que incluso para objetos no const esta acción es dudosa. –
@MatthieuM. ¿Por qué? Me parece válido (incluso si agrega una clase base a la estructura C). –
@VJovic: siempre que el constructor no se haya ejecutado, el objeto aún no está activo; consulte la visión de Sutter en [Fallas del constructor (o, los objetos que nunca fueron)] (http://www.gotw.ca/publications) /mill13.htm). Si un objeto aún no está vivo, acceder a él es dudoso. No digo que sea necesariamente indefinido o no especificado, solo que "huele mal". –