C++ C++;阵列向量

C++ C++;阵列向量,c++,arrays,c++11,initializer-list,C++,Arrays,C++11,Initializer List,为什么这样做有效: std::pair<int, int> p = {1,2}; std::vector<std::pair<int, int>> vp = { {1,2}, {3,4} }; std::pair p={1,2}; 向量vp={1,2},{3,4}; 但这不是吗 std::array<int, 2> a = {1,2}; // still ok std::vector<std::array<int, 2>>

为什么这样做有效:

std::pair<int, int> p = {1,2};
std::vector<std::pair<int, int>> vp = { {1,2}, {3,4} };
std::pair p={1,2};
向量vp={1,2},{3,4};
但这不是吗

std::array<int, 2> a = {1,2}; // still ok
std::vector<std::array<int, 2>> va = { {1,2}, {3,4} };
std::数组a={1,2};//还可以吗
向量va={1,2},{3,4};
使用带有
-std=c++0x
的g++4.5.1,第二行出现以下故障:

错误:无法将
'{{1,2},{3,4}}}'
转换为
'std::vector'

谢谢

这很有效:

std::vector<std::array<int, 2>> va = {
  std::array<int, 2>{1,2},
  std::array<int, 2>{3,4}
};
std::vector va={
std::数组{1,2},
std::数组{3,4}
};
更深入地说,std::pair似乎有一个接受初始化器列表的构造函数,但std::array没有:

std::pair<int, int> p ({1,2}) ;  // OK
std::array<int, 2> a ({1,2}) ;   // Invalid
std::对p({1,2});//好啊
数组a({1,2});//无效的

但是现在我已经不懂了。

不幸的是,
std::array
没有初始值设定项列表构造函数。实际上,它没有任何用户定义的构造函数——这个“特性”是C++03的遗留,在C++03中,省略所有用户定义的构造函数是启用C风格大括号初始化的唯一方法。这是现行标准中的一个缺陷

那么,在这种情况下,为什么内置的大括号初始化不起作用呢?让我们看看引擎盖下的
std::array
是什么样子:

template <typename T, int i> struct array {
    T data[i];
    // ...
}
C(因此C++)有一个关于大括号省略的特殊规则,允许省略内部大括号,除非有歧义<代码>数组利用此功能,允许我们编写

std::array<int, 2> a = { 1, 2 };
std::数组a={1,2};
那么,为什么原始帖子中的示例不起作用呢?因为大括号省略只允许在C风格聚合初始化的上下文中使用,如果涉及到更复杂的内容,例如用户定义的初始值设定项列表构造函数,则不允许

尽管如此,以下方法还是可以奏效的:

std::vector<std::array<int, 2>> vp = { {{1,2}}, {{3,4}} };
std::vector vp={{{{1,2}},{{{3,4}};
事实上,至少在GCC4.5和GCC4.6上,它没有,这在我看来似乎表明了一个编译器错误。不过,我并不完全确定


这个问题有点相关:

你能澄清一下“失败”吗?(比如给出编译器的错误?)哪个操作系统?可能是个编译器bug@VJo@mat已添加更多详细信息,谢谢!我实际上怀疑gcc 4.5.1在这个问题上没有完全符合。不幸的是,我不知道有什么在线编译器可以在这里提供帮助(ideone使用4.5.1)。实际上,您让编译器在这里推断大括号初始值设定项列表中元素的类型。我想这就是问题所在,但仍然不知道它是否应该按照标准工作。我怀疑
std::array
看起来更像
template
是的,您的最后一个示例应该可以工作。除了一个简单的
T={…}
声明之外,不支持括号省略是一个有意识且经过讨论的决定。这也是为什么
return{…}
不能使用
std::array
return类型的原因;关于gcc 4.7.2的工程
std::vector<std::array<int, 2>> vp = { {{1,2}}, {{3,4}} };