浏览标准草案(n3242)我在第9.2条(强调我的)中找到了这句话:
非静态(9.4)数据成员不应具有不完整类型.特别是,类C不应包含类C的非静态成员,但它可以包含指向C类对象的指针或引用.
从这里我认为可以定义这样的类:
class A {
public:
A(A& a) : a_(a){
}
private:
A& a_;
};
Run Code Online (Sandbox Code Playgroud)
然后在第8.3.2节中我发现了以下内容:
应初始化引用以引用有效的对象或函数
问题1:是否允许定义此类型的对象,并将其名称作为参考:
A a(a);
Run Code Online (Sandbox Code Playgroud)
或者这会触发未定义的行为?
问题2:如果是,标准的哪些部分允许从仍待构建的对象初始化引用?
问题3:如果不是,这是否意味着A类的定义形式良好但是没有触发UB就不能创建第一个对象?在这种情况下,这背后的理由是什么?
class A
{
A a;//why can't we do this
};
Run Code Online (Sandbox Code Playgroud)