用户定义类型的容器列表初始化的行为并不像我期望的那样。看下面这段代码片段:
#include <array>
struct A {
char C;
int s;
};
int main(int argc, char * argv[]) {
A x = {'x'}, y = {'y'};
std::array<int, 2> i = {1, 2}; // Ok
std::array<A, 2> a = {x, y}; // Ok
//std::array<A, 2> b = { {'x',1000}, {'y',2000} }; // Error: too many initializers!!!
std::array<A, 2> c = { A{'x',1000}, A{'y',1000} };
std::array<A, 2> d = {{ {'x',1000}, {'y',1000} }}; // Ok!!
std::array<A, 2> e = {'x', 2000, 'y', 5000}; // Ok!!
}
我可以像初始化基本数组一样初始化i
。只要它们是变量,我也可以使用相同的方法初始化a
。但是我不能在不指定类型A
的情况下初始化b
,就像在c
中一样。
要在不显式声明类型
A
的情况下初始化std::array
,我必须添加另一对大括号。为什么需要双层大括号呢?为什么不能像b
中那样用一对大括号围绕列表进行初始化呢?出人意料的是,
c
有效且只生成了两个对象!直觉上,我会期望e
会产生错误,因为有4个初始值和最多只能容纳2个对象,但是编译器正确地填充了A
的成员!为什么会发生这种情况?