c++ - que - referencias cruzadas word mac
En una declaración con inicialización, ¿puedo usar una referencia a datos no inicializados? (1)
Tengo una función que crea y devuelve un objeto. También tiene un efecto secundario, escribir una bandera de éxito en una variable booleana:
struct MyObject
{
...
int field1;
char field2;
bool field3;
};
MyObject CreateMyObject(bool& success)
{
...
}
Por pura coincidencia sucede que tengo que guardar la bandera de éxito en mi objeto. Entonces puedo escribirlo de esta manera obvia:
bool success;
MyObject x = CreateMyObject(success);
x.field3 = success;
O de esta manera:
MyObject x = CreateMyObject(x.field3);
¿La segunda forma implica un comportamiento indefinido, desde asignaciones múltiples a field3
o de otra manera?
(Mi struct
no es un POD, si eso importa)
Las personas que escribieron el estándar han pensado en este caso, y la mala noticia es que está prohibido:
12.7 Construcción y destrucción
1 - Para un objeto con un constructor no trivial, hacer referencia a cualquier miembro no estático o clase base del objeto antes de que el constructor comience la ejecución da como resultado un comportamiento indefinido. [...]
Hay un ejemplo dado que está muy cerca de tu código:
struct W { int j; };
struct X : public virtual W { };
struct Y {
int *p;
X x;
Y() : p(&x.j) { // undefined, x is not yet constructed
}
};
En ese caso, el comportamiento indefinido está formando un puntero a un miembro de un miembro aún no construido; formar una referencia a un miembro es lo suficientemente similar.
Creo que está bastante claro que para pasar la referencia a su constructor, debería tomar la referencia (al miembro del objeto) antes de que el constructor comience la ejecución .