具有类成员默认值的C ++ 11默认构造函数行为

时间:2019-04-16 11:57:03

标签: c++ c++11

这个问题是针对C ++ 11的。

在以下结构 A 中,当使用默认构造函数时, x 是否始终为42?

struct A{
  A() = default;
private:
  int x = 42;
}

简而言之,我想知道默认构造函数是否保证将设置默认成员值。

1 个答案:

答案 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 ),然后:

     
      
  1. 如果实体是具有默认成员初始化程序([class.mem])的非静态数据成员,并且      
        
    1. 构造函数的类是联合([class.union]),并且 mem-initializer-id
    2. 不指定该联合的其他变体成员。   
    3. 构造函数的类不是联合体,并且,如果实体是匿名联合体的成员,则 mem-initializer-id 不会指定该联合体的其他成员。实体是根据[dcl.init] ;
    4. 中指定的默认成员初始值设定项初始化的   
  2.   
     

[..]


  

简而言之,我想知道默认构造函数是否保证将设置默认成员值。

An example of exactly this遵循上文引用的段落。


但是,如果要定义A::A()并为xit would take precedence over the inline initialiser提供初始化程序。