类中成员初始值设定项和初始化列表之间的冲突解决方案
Conflict resolution between in-class member initializer and initialization list
让我在问题前面加上以下代码:
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中的副作用不会发生地点。--结束示例]
相关文章:
- 复制列表初始化的隐式转换的等级是多少
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C++11 中的混合列表初始化
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- C++20 从括号中的值列表初始化聚合,不支持内部数组
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 默认参数和空列表初始化
- 如何在列表初始化中放置额外的语句?
- C++列表初始化允许多个用户定义的转换
- 列表初始化是否将原子初始化为零
- 使用可变模板列表初始化数组,并放置new
- 使用整数初始化列表初始化长双精度的向量
- 直接列表初始化的自动规则
- 使用初始化列表初始化unique_ptr的容器,继续
- 如何修复"非聚合无法使用初始值设定项列表初始化" <map>
- 直接列表初始化和复制列表初始化之间的差异
- 为什么我可以在不使用赋值运算符的情况下使用列表初始化普通数组
- C++ - 使用类中的初始值设定项列表初始化动态集