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初始化成员数组?