C++向量的数组

and*_*ini 28 c++ arrays initializer-list c++11

为什么这样做:

std::pair<int, int> p = {1,2};
std::vector<std::pair<int, int>> vp = { {1,2}, {3,4} };
Run Code Online (Sandbox Code Playgroud)

但这不是吗?

std::array<int, 2> a = {1,2}; // still ok
std::vector<std::array<int, 2>> va = { {1,2}, {3,4} };
Run Code Online (Sandbox Code Playgroud)

使用g ++ 4.5.1 -std=c++0x,第二行失败:

错误:无法转换‘{{1, 2}, {3, 4}}’‘std::vector<std::array<int, 2u> >’

谢谢

Joh*_*esD 24

不幸的是,std::array没有初始化列表构造函数.实际上,它没有任何用户定义的构造函数 - 这个"特性"是来自C++ 03的遗留物,其中省略所有用户定义的构造函数是启用C样式大括号初始化的唯一方法.恕我直言是当前标准的一个缺陷.

那么为什么在这种情况下没有内置的大括号初始化工作呢?让我们看看std::array幕后的内容:

template <typename T, int i> struct array {
    T data[i];
    // ...
}
Run Code Online (Sandbox Code Playgroud)

好吧,所以这并不意味着我们必须在初始化程序中使用括号(一对array,data成员的另一对?

std::array<int, 2> a = { {1, 2} };
Run Code Online (Sandbox Code Playgroud)

C(以及因此C++)有一个关于括号省略的特殊规则,除非存在歧义,否则允许省略内括号.array利用此功能,允许我们编写

std::array<int, 2> a = { 1, 2 };
Run Code Online (Sandbox Code Playgroud)

那么为什么原帖中的例子不起作用呢?因为大括号省略只允许在C风格聚合初始化的上下文中使用,而不是涉及更复杂的内容,例如用户定义的初始化列表构造函数.

但是,以下应该可行,因为它很丑陋:

std::vector<std::array<int, 2>> vp = { {{1,2}}, {{3,4}} };
Run Code Online (Sandbox Code Playgroud)

事实上,至少在gcc 4.5和gcc 4.6上,它似乎没有表明编译器错误.不过,我并不完全确定.

这个问题有点相关:如何使用initializer_list初始化成员数组?