为什么std::array不包含初始化列表构造函数
Why std::array does not contain an initializer-list constructor
为了用一些值初始化std::array
,您需要使用以下方法:
std::array<int,3> an_array{{3,4,5}};
我知道我们需要两个花括号的原因(一个用于std::array
,另一个用于内部的c-style array
)。
我的问题:为什么,按照标准,std::array
不包含直接初始化内部c-style array
的初始化列表构造函数?初始化为
std::array<int,3> an_array{3,4,5};
编辑:此信息来自http://en.cppreference.com/w/cpp/container/array。我认为我的编译器允许第二个版本直接作为非标准扩展。现在,我甚至不确定这个案例的标准到底是什么。
//构造使用聚合初始化
std::array<int, 3> a1{ {1, 2, 3} };
//c++ 11需要双括号(c++ 14不需要)
标准对std::array
的定义如下(针对c++ 11的N3337,但引用的部分在N4140中是相同的):
§23.3.2.1 (array.overview)/2
数组是一个聚合,可以用语法
进行初始化array<T, N> a = { initializer-list };
和聚合定义为:
§8.5.1 [dcl.init.aggr]/1
聚合是一个没有用户提供的数组或类构造函数,没有私有或受保护的非静态数据成员,没有基类,而非虚函数。
所以它不能有一个用户定义的构造函数,而initializer_list
的构造函数应该是这样的。
此外,c++ 11仅为T x = { a }
语法定义了大括号省略:
§8.5.1 [dcl.init.aggr]/11
在
形式的声明中T x = { a };
大括号可以在初始化列表中省略,如下所示。[…]
而c++ 14 (N4140)取消了此要求:
§8.5.1 [dcl.init.aggr]/11
大括号可以在初始化列表中省略,如下所示。[…]
所以下面是完全有效的c++ 14及以上版本:
std::array<int,3> an_array{3,4,5}
- C++类 - 初始化列表 - 递归 - 按值传递
- 在初始化列表之外手动调用基类的构造函数
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- std::map与谓词与初始化列表
- 类内初始化与构造函数初始化列表的顺序
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 使用初始化列表填充C++中的多维结构数组时出现问题
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- C++初始化列表与分配值
- C++初始化列表中的向量集大小或调整大小
- 在构造函数初始化列表中使用 std::variant
- emplace_back初始化列表错误,当初始化列表在独立变量上工作时
- 解释了构造函数成员初始化列表
- 使用初始化列表时如何获取私有数据?
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 如何在成员初始化列表中声明共享指针
- 庞大的初始化列表,如何修复"fatal error C1060: compiler is out of heap space"
- 我可以检查初始化列表中设置的构造函数主体中的变量吗
- 使用整数初始化列表初始化长双精度的向量
- 是否可以在C++中使用初始化列表设置数组的特定成员?