【发布时间】:2020-11-22 12:34:50
【问题描述】:
用户定义类型的容器的列表初始化并不像我预期的那样运行。 看到这个sn-p:
#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。
-
要初始化
std::array而不明确说明A的类型,我必须添加另一对大括号。需要双括号背后的逻辑是什么?为什么不能像b那样用一对大括号包围列表来初始化它? -
另外,令人惊讶的是
c有效,它只产生两个对象!直观地说,我希望e会产生错误,因为最多 2 个对象有 4 个初始值,但编译器会正确填写A的成员!为什么会这样?
【问题讨论】:
-
这个answer 解决了一个类似于 1) 的问题,但是 2) 没有得到回答。
标签: c++ curly-braces stdarray list-initialization