sirven referencias referencia que programacion para mac las imagen ilustraciones hacer ejemplo cruzadas cruzada con como c++ reference initialization undefined-behavior

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 .