c++ - 为什么 std::vector 和 std::array 的 C++ initializer_list 行为不同?

标签 c++ stl c++11

代码:

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)被省略,也就是说,当旧样式 =用来 。此允许大括号省略的规则不适用于直接列表初始化。这里有一个脚注:“在列表初始化的其他用途中不能省略大括号。”

有一个关于此限制的缺陷报告:CWG defect #1270 .如果提议的解决方案被采纳,其他形式的列表初始化将允许大括号省略,并且以下将是格式良好的:

std::array<int, 4> y{ 1, 2, 3, 4 };

(向 Ville Voutilainen 致敬,感谢他查找缺陷报告。)

关于c++ - 为什么 std::vector 和 std::array 的 C++ initializer_list 行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11400090/

相关文章:

c++ - 有没有办法按值搜索宏名称?

c++ - 将属性转换为 boost::variant

c++ - 直接定义转换函数以引用数组的 ISO C++ 方法是什么?

C++ STL容器插入拷贝

c++ - 显式特化 - template-id 与任何模板声明都不匹配

c++ - 从 vector 中移除项目,并对移除的项目进行变异

c++ - 使用 C 与使用 C++ 实现神经网络?

c++ - 在 OS X 10.9 上找不到“ext/slist”文件

c++ - 使用 emplace_back 指向 const 对象的指针

c++11:它的gc接口(interface)是什么,如何实现?