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

迈克尔·戈德施泰因

让我在问题之前添加以下代码:

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的建设完成?

juanchopanza

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

例如,

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初始化程序指定的初始化,并且非静态数据成员的大括号或相等初始化程序为忽略了。[示例:给定

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

A(int)构造函数将简单地将i初始化为arg的值,并且不会发生i的大括号或相等初始化器中的副作用。—结束示例]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章