【发布时间】:2018-04-11 10:43:52
【问题描述】:
我阅读了 c++ 11 标准草案(N3242 修订版)并遇到以下声明:
(12.7 构造和破坏)。对于具有非平凡构造函数的对象,引用该对象的任何非静态成员或基类 在构造函数开始执行之前会导致未定义的行为。
据我了解,Foo 的默认构造函数具有未定义的行为(在代码段 i(&a.i)?
Foo 的构造函数不是微不足道的(因为它是用户定义的),我指的是成员 a 在执行构造函数之前。
struct A
{
int i;
};
struct Foo
{
A a;
int* i;
Foo() : a(), i(&a.i)
{}
};
UPD:int* 类型的成员的用法可能信息量不大(例如,int 类型更适合)
【问题讨论】:
-
“我指的是在构造函数执行之前的成员 a。” 不,你不是。你刚刚用
a()构建了它。a.i未初始化,但获取地址是可以的。 -
@underscore_d 实际上,由于
a在构造函数初始化列表中是 value initialized,所以a.i的值被明确定义为零(整个结构a及其所有成员也是初始化值)。 -
@LmTinyToon 至于您的问题,在构造函数初始化程序中列出内存中所有 exists 成员。它们可能没有被初始化,但它们确实作为周围
Foo对象的一部分存在(在这种情况下)。 -
@LmTinyToon 即使在这种情况下也没关系,因为初始化是按照在类中声明成员变量的顺序进行的。这意味着
a将被完全初始化,包括a.i,因此引用它并将其用作值是可以的。 -
@LmTinyToon 您的示例中没有任何内容与您对标准的引用相矛盾。同样,如果一个对象在其自己的构造函数初始化列表中对其自己的成员执行任何操作是非法的,则该语言将不存在。
标签: c++ c++11 constructor language-lawyer