列表与隐式初始化字段的直接聚合初始化

问题描述 投票:0回答:1

如果我们对比聚合的列表初始化聚合的直接初始化,如果我没有为所有字段指定初始值设定项,那么我认为以下情况适用:

对于非联合聚合,每个不是显式初始化元素的元素都按如下方式初始化:

  • 如果元素具有默认成员初始值设定项,则该元素将从该初始值设定项初始化。 (自 C++11 起)
  • 否则,如果该元素不是引用,则该元素将从空的初始值设定项列表中复制初始化。
  • 否则,程序格式错误。

否则,如果目标类型是 a (可能是 cv 限定的) 聚合类,它按照聚合中的描述进行初始化 初始化,但允许缩小转换, 不允许指定的初始值设定项,临时绑定到 引用的生命周期没有延长,没有大括号 省略,任何没有初始化器的元素都是 值已初始化。

我的问题是,从空初始化器列表中复制初始化和值初始化有什么区别?也许需要改变语言?

c++ language-lawyer c++23
1个回答
0
投票
{}

的 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

© www.soinside.com 2019 - 2024. All rights reserved.