如果我们对比聚合的列表初始化和聚合的直接初始化,如果我没有为所有字段指定初始值设定项,那么我认为以下情况适用:
对于非联合聚合,每个不是显式初始化元素的元素都按如下方式初始化:
- 如果元素具有默认成员初始值设定项,则该元素将从该初始值设定项初始化。 (自 C++11 起)
- 否则,如果该元素不是引用,则该元素将从空的初始值设定项列表中复制初始化。
- 否则,程序格式错误。
否则,如果目标类型是 a (可能是 cv 限定的) 聚合类,它按照聚合中的描述进行初始化 初始化,但允许缩小转换, 不允许指定的初始值设定项,临时绑定到 引用的生命周期没有延长,没有大括号 省略,任何没有初始化器的元素都是 值已初始化。
我的问题是,从空初始化器列表中复制初始化和值初始化有什么区别?也许需要改变语言?
{}
的 copy-init 可以:
struct X {
X(std::initializer_list<int>);
};
struct Y {
int i;
X x;
};
Y y1{ 1 }; // OK: `Y{ 1, {} }`, or `Y{ 1, X(std::initializer_list<int>{}) }`
// Y y2(1); // Error: Cannot value-init x, it has no default constructor