代码:
std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};
为什么我需要在std::array中使用双花括号?
std::array<T, N>
是一个聚合类型: 它没有任何用户声明的构造函数,甚至没有一个使用std::initializer_list
的构造函数。使用花括号进行初始化时,采用的是C++中从C继承而来的聚合初始化特性。
"旧风格"的聚合初始化使用等号=
:
std::array<int, 4> y = { { 1, 2, 3, 4 } };
使用这种旧式的聚合初始化方式,多余的大括号可以省略,因此这等同于:
std::array<int, 4> y = { 1, 2, 3, 4 };
T x = { a };
时省略(C++11 §8.5.1/11),也就是说,当使用旧式的=
时。允许省略花括号的规则不适用于直接列表初始化。这里的一个脚注指出:“在列表初始化的其他用法中不能省略花括号。”std::array<int, 4> y{ 1, 2, 3, 4 };
std::array<int> y = {1,2,3,4};
虽然会收到Clang的建议使用花括号进行初始化,但仍能正常工作,而不会像“在使用直接列表初始化时省略子对象初始化的花括号”那样产生严格错误。 - Xeostd::vector
提供了一个接受 std::initializer_list<T>
的构造函数,而 std::array
没有构造函数,在初始化列表 {1, 2, 3, 4}
中实际上不被解释为 std::initializer_list
,而是用于初始化 std::array
内部 C 风格数组的聚合初始化(这就是第二组大括号的含义:一组用于 std::array
,一组用于内部 C 风格成员数组)。
std::array
的第二组大括号,还是只是收到了警告?对我来说,std::array<int,4> y{1,2,3,4};
是可以工作的。 - bames53