Pip*_*ppo 3 arrays initialization vector c++11
在C++ 11中,有一种很好的方法来初始化一个数组向量(我的意思是C++类),它有一个元素,比如
std::vector<std::vector<int> > foo(3, std::vector<int>(2, 1));
Run Code Online (Sandbox Code Playgroud)
用全1来初始化向量的3x2向量?
不幸的是,阵列矢量的模拟似乎不起作用; 我真的有义务使用for循环吗?
也许是这样的?
#include <vector>
#include <array>
#include <iostream>
int main()
{
std::vector< std::array<int, 2> > v(3, {1,1});
for(auto const& e0 : v)
{
for(auto const& e1 : e0)
std::cout << e1 << ", ";
std::cout << "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
1, 1, 1, 1, 1, 1,
"我们为什么要使用两个括号?"
我的问题中的原始代码是
std::vector< std::array<int, 2> > v(3, {{1,1}});
Run Code Online (Sandbox Code Playgroud)
但我决定删掉第二对牙套.他们一直在那里压制clang ++警告:通常,std::array包含一个(原始)数组.一对大括号足以初始化这个内部数组,但是clang ++发出警告,因为{1,1}(一对大括号)的元素用于初始化这个内部数组的元素,而不是聚合(外部std::array)本身.Quoth clang ++:
警告:建议围绕子对象初始化
我在标准中看了这个,它需要在[array.overview]/2中
数组是可以使用语法初始化的聚合(8.5.1)
array<T, N> a = {初始化列表};其中initializer-list是逗号分隔的列表,
N其中包含可转换为的类型的元素T.
参数传递使用与这种初始化形式相同的规范(称为复制初始化,[dcl.init]/15),因此使用一对大括号可以保证工作.
OTOH,没有要求std::array包含(原始)数组.