Снимая стандартную черновик (n3242), я нашел это предложение в разделе 9.2 (выделение мое):
Нестатические (9.4) элементы данных не должны иметь неполных типов. В в частности, класс C не должен содержать нестатический член класса C, но он может содержать указатель или ссылку для объекта класса С.
Из этого я утверждаю, что это нормально, чтобы определить такой класс:
class A {
public:
A(A& a) : a_(a){
}
private:
A& a_;
};
Затем в разделе 8.3.2 я нашел следующее:
Ссылка должна быть инициализирована для ссылки на действительный объект или Функция
Вопрос 1: Разрешено ли определять объект этого типа, передавая его имя в качестве ссылки:
A a(a);
или это приведет к срабатыванию undefined поведения?
Вопрос 2: Если да, то каковы части стандарта, которые позволяют инициализировать ссылку из объекта, который все еще будет построен?
Вопрос 3: Если нет, значит ли это, что определение класса A хорошо сформировано, но не может быть создан первый объект без запуска UB? В этом случае, в чем причина этого?