这个问题是针对C ++ 11的。
在以下结构 A 中,当使用默认构造函数时, x 是否始终为42?
struct A{
A() = default;
private:
int x = 42;
}
简而言之,我想知道默认构造函数是否保证将设置默认成员值。
答案 0 :(得分:1)
是的
不幸的是,下面的措词来自今天的标准草案,但是原理在C ++ 11中是相同的。
[class.default.ctor]/4
默认使用且未定义为删除的默认构造函数在 odr用([basic.def.odr]
)创建其类类型的对象时隐式定义([intro.object]
,持续评估([expr.const]
)所需的时间,或在首次声明后明确将其默认设置的时间。 隐式定义的默认构造函数执行该类的初始化集,该初始化集将由该类的用户编写的默认构造函数执行,而无需 ctor-initializer ([class.base.init]
)以及一个空的复合语句。
[class.base.init]/9
在非委托构造函数中,如果给定的潜在构造子对象未由 mem-initializer-id 指定(包括不存在< em> mem-initializer-list ,因为构造函数没有 ctor-initializer ),然后:
- 如果实体是具有默认成员初始化程序(
[class.mem]
)的非静态数据成员,并且
- 构造函数的类是联合(
不指定该联合的其他变体成员。[class.union]
),并且 mem-initializer-id 或- 构造函数的类不是联合体,并且,如果实体是匿名联合体的成员,则 mem-initializer-id ,不会指定该联合体的其他成员。实体是根据
中指定的默认成员初始值设定项初始化的[dcl.init]
;[..]
简而言之,我想知道默认构造函数是否保证将设置默认成员值。
An example of exactly this遵循上文引用的段落。
但是,如果要定义A::A()
并为x
,it would take precedence over the inline initialiser提供初始化程序。