类内成员初始化程序和初始化列表之间的冲突解决

时间:2014-04-10 14:35:09

标签: c++ c++11

让我先在问题的前面加上以下代码:

struct A
{
  explicit A(int i):a_{i} {}

  int a_
};

struct B
{
  B():mya_{5} {} // Initialize mya_ (again?)

  A mya_{7}; // Initialize mya_
};

struct B中,我们在mya_的内联初始值设定项与mya_的构造函数初始化列表中初始化的B之间存在冲突。根据C ++标准如何解决这个问题?当mya_.a_的构造完成时,B的最终值应该是什么?

1 个答案:

答案 0 :(得分:3)

初始化列表获胜。如果你有另一个没有初始化成员的构造函数,就会获得就地初始化。

例如,

struct B
{
  B():mya_{5} {}
  B(int) {}
  A mya_{7};
};

int main
{
  B b0;    // b.mya_.a_ is 5
  B b(42); // b.mya_.a_ is 7
}

来自 12.6.2初始化基础和成员[class.base.init]

  

如果给定的非静态数据成员同时具有   brace-or-equal-initializer和mem-initializer,初始化   由mem-initializer指定执行,以及非静态数据   member的brace-or-equal-initializer被忽略。 [例子:给定

struct A {
int i = /∗ some integer expression with side effects ∗/ ;
A(int arg) : i(arg) { }
// ...
};
  

A(int)构造函数只需将i初始化为arg的值,   并且i的支撑或均衡初始化器中的副作用将不会   地点。 - 结束例子]