浏览标准草案(n3242)我在第 9.2 条中发现了这句话(强调我的):
非静态(9.4)数据成员不得具有不完整的类型。在
特别是,类 C 不应包含类的非静态成员
C,但是它可以包含一个指针或参考到类的对象
C。
由此我认为定义一个这样的类是可以的:
class A {
public:
A(A& a) : a_(a){
}
private:
A& a_;
};
然后在第 8.3.2 条中我发现了以下内容:
应初始化引用以引用有效对象或者
功能
问题一:是否允许定义此类型的对象并将其名称作为引用传递:
A a(a);
或者这会触发未定义的行为?
问题2:如果是,标准的哪些部分允许从仍待构造的对象初始化引用?
问题3:如果不是,这是否意味着 A 类的定义格式良好,但没有first可以在不触发UB的情况下创建对象吗?在这种情况下,其背后的理由是什么?
标准中没有定义“有效对象”,但它旨在表示具有适当大小和对齐方式的内存区域,可以包含指定类型的对象。它只是意味着排除对取消引用的空指针、未对齐的内存区域等的引用。未初始化的对象是有效的。
有一个悬而未决的问题需要澄清措辞,CWG 453 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#453.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)