在std::array
的C ++标准中,它说:
数组是一个聚合(8.5.1),可以用它初始化 语法
数组a = {initializer-list};
其中initializer-list是 逗号分隔的最多N个元素的列表,其类型是可转换的 到T。
它还说std::array
是一种聚合类型,它的构造函数是隐式生成的。
要使用初始化列表初始化std::array
,必须使用构造函数将std::initializer_list
作为参数。
构造函数是否也为用户定义的类型隐式生成了std::initializer_list
,或者它是否特定于std::array
?
答案 0 :(得分:5)
不,编译器不生成一个std::initializer_list
的构造函数,既不用于std::array
也不用于任何其他聚合类型。
您在此处观察到的是aggregate initialization,它与std::initializer_list
完全无关。
您提供的标准代码段中的“初始化列表”一词是指初始值设定项列表,它与std::initializer_list
无关。
您可以使用以下内容进行测试:
struct A {
int i;
std::string str;
};
int main() {
A a{1, "asdf"};
}
这很有效,但显然没有使用std::initializer_list
,因为它只能同时处理单个类型。
答案 1 :(得分:1)
std::array
是聚合的,因此使用聚合初始化,并且不会生成接收std::initializer_list
的构造函数。
如果初始化程序是(非括号内的) braced-init-list , 对象或引用是列表初始化的(8.5.4)。
列表初始化是从a初始化对象或引用 支撑-INIT列表。这样的初始化程序称为初始化列表, 和列表中以逗号分隔的 initializer-clauses 称为 初始化列表的元素。
对象或类型
T
的引用的列表初始化定义为 如下:如果
T
是聚合,则执行聚合初始化(8.5.1)。按指定的初始化列表初始化聚合时 在8.5.4中,初始化列表的元素被视为 增加下标的聚合成员的初始化程序 或会员订单。每个成员都是从中复制初始化的 相应的 initializer-clause 。
答案 2 :(得分:0)
编辑:
语法适用于聚合类型
#include <iostream>
using namespace std;
struct A {
int a;
int b;
int get_a() {return a;}
};
int main() {
A a1({4,5});
A a2{1,2};
cout << a1.a << '\n';
cout << a2.b << '\n';
return 0;
}
但从技术上讲,对于聚合类型,没有创建构造函数。这些调用呈现两种形式的list initialization。由于T
是一个聚合,因此它属于aggregate initialization相关项目符号。