Suppose we have the following:
struct C;
struct B {
C& c;
B(C& c) : c{c} {}
};
struct A;
struct C {
A& a;
C(A& a) : a{a} {}
};
struct A {
B b;
C c;
A() : b(c), c(*this) {}
};
It seems to be legal to initialize member variable c
with this
because this
can be used to refer to the object being initialized in the initializer list. But when passing c
to b
's constructor, c
's lifetime has not begun and since it does have a reference member, an old pointer cannot be used to manipulate the new C
object.
I believe the above is well behaved / intuitively reasonable as b
never uses it's c
reference before the object c
is fully constructed though.
What part of the language specifies that this works appropriately?
Edit: to clarify, what makes it legal to access c
through b
after construction for the A
object has been completed? i.e after all lifetimes have begun.