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

Conflict resolution between in-class member initializer and initialization list

本文关键字:列表 初始化 之间 解决方案 冲突 成员      更新时间:2023-10-16

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

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_的类内初始化器和B的构造函数的初始化器列表中初始化的mya_之间存在冲突。根据C++标准,这是如何解决的?当B的构造完成时,mya_.a_的最终值应该是什么?

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

例如,

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或equal初始化器和mem初始化器,初始化执行由mem初始值设定项指定的,并且非静态数据忽略成员的大括号或等号初始值设定项。[示例:给定

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

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