C++ 类内成员初始值设定项和初始化列表之间的冲突解决方案

C++ 类内成员初始值设定项和初始化列表之间的冲突解决方案,c++,c++11,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中,在B的构造函数的初始值设定项列表中初始化的mya\u的类内初始值设定项与mya\u之间存在冲突。这是如何解决的,根据C++标准,当代码< b>代码>的构造

让我先用以下代码来回答问题:

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
中,在
B
的构造函数的初始值设定项列表中初始化的
mya\u
的类内初始值设定项与
mya\u
之间存在冲突。这是如何解决的,根据C++标准,当代码< b>代码>的构造完成时, Myaa.Ay的最终值应该是什么?< /P> < P>初始化列表获胜。如果您有另一个未初始化成员的构造函数,则就地初始化将获胜

比如说,

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]

如果给定的非静态数据成员同时具有 大括号或相等的初始值设定项和mem初始值设定项,初始化 执行mem初始值设定项指定的,并且 忽略成员的大括号或相等初始值设定项。[示例:给定

A(int)构造函数将简单地将i初始化为arg的值, 我的支架或同等初始化器的副作用不会发生 地点-结束示例]


初始化列表获胜。如果您有另一个未初始化成员的构造函数,则就地初始化将获胜

比如说,

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]

如果给定的非静态数据成员同时具有 大括号或相等的初始值设定项和mem初始值设定项,初始化 执行mem初始值设定项指定的,并且 忽略成员的大括号或相等初始值设定项。[示例:给定

A(int)构造函数将简单地将i初始化为arg的值, 我的支架或同等初始化器的副作用不会发生 地点-结束示例]


初始化列表获胜。如果您有另一个未初始化成员的构造函数,则就地初始化将获胜

比如说,

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]

如果给定的非静态数据成员同时具有 大括号或相等的初始值设定项和mem初始值设定项,初始化 执行mem初始值设定项指定的,并且 忽略成员的大括号或相等初始值设定项。[示例:给定

A(int)构造函数将简单地将i初始化为arg的值, 我的支架或同等初始化器的副作用不会发生 地点-结束示例]


初始化列表获胜。如果您有另一个未初始化成员的构造函数,则就地初始化将获胜

比如说,

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]

如果给定的非静态数据成员同时具有 大括号或相等的初始值设定项和mem初始值设定项,初始化 执行mem初始值设定项指定的,并且 忽略成员的大括号或相等初始值设定项。[示例:给定

A(int)构造函数将简单地将i初始化为arg的值, 我的支架或同等初始化器的副作用不会发生 地点-结束示例]