template structur objects c++ constructor initialization circular-dependency initialization-list

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