c++ - structur - Dependencia circular en la lista de inicialización del constructor
template class c++ (1)
¿Está lo siguiente bien definido?
class A;
class B;
// define A, which takes B& in constructor
// define B, which takes A& in constructor
class C
{
A a;
B b;
public:
C() : a(b), b(a) { /* stuff with a and b */ }
}
Ejemplo completo en ideone.com .
¿Es seguro / bien definido siempre que los constructores de A
y B
no hagan nada con las referencias que obtienen?
N4140 [class.cdtor] / 1 dice:
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. Para un objeto con un destructor no trivial, hacer referencia a cualquier miembro no estático o clase base del objeto después de que el destructor finalice la ejecución da como resultado un comportamiento indefinido.
Si bien este pasaje en sí mismo no implica que el comportamiento esté bien definido, el siguiente ejemplo muestra que sí lo está. Aquí hay un extracto:
struct B : public A { int j; Y y; }; // non-trivial
extern B bobj;
B* pb = &bobj; // OK
Entonces la respuesta es: sí, el comportamiento en su caso está bien definido si no se está refiriendo a miembros o clases base de b
en el constructor de A