在阅读 c++11 标准(修订版 N3242)时,我遇到了以下声明:
(12.7 建造和破坏)。对于具有非平凡构造函数的对象,在构造函数开始执行之前引用对象的任何非静态成员或基类会导致未定义的行为。
也就是说,据我了解,以下构造函数代码Foo包含未定义的行为(在初始化站点i)?
struct A
{
int i;
};
struct Foo
{
A a;
int i;
Foo() : a(), i(a.i)
{}
};
在阅读 c++11 标准(修订版 N3242)时,我遇到了以下声明:
(12.7 建造和破坏)。对于具有非平凡构造函数的对象,在构造函数开始执行之前引用对象的任何非静态成员或基类会导致未定义的行为。
也就是说,据我了解,以下构造函数代码Foo包含未定义的行为(在初始化站点i)?
struct A
{
int i;
};
struct Foo
{
A a;
int i;
Foo() : a(), i(a.i)
{}
};
在我看来,代码是正确的,因为 啊;当 int i; 初始化时已经初始化。以下代码将具有未定义的行为:
因为 i 将在 A a; 之前创建。据我所知,类成员是按照类中的声明顺序初始化的。