如何放置到 std::array 的 std::vector?

Fid*_*ido 1 c++ stdvector stdarray emplace

使用向量向量,我可以这样做:

std::vector<std::vector<int>> vov;
vov.emplace_back(std::initializer_list<int>{0, 0});
Run Code Online (Sandbox Code Playgroud)

但是, std::array 的向量等效失败:

std::vector<std::array<int, 2>> voa;
voa.emplace_back(std::initializer_list<int>{0,0});
Run Code Online (Sandbox Code Playgroud)

在向量中放置数组的正确方法是什么?

编辑:

是的,您可以从初始化列表创建 std::array :

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

工作正常。

错误:

error C2664: 'std::array<int,2>::array(const std::array<int,2> &)': cannot convert argument 1 from 'std::initializer_list<int>' to 'const std::array<int,2> &'
Run Code Online (Sandbox Code Playgroud)

IlC*_*ano 9

std::array 没有任何构造函数,它的初始化遵循聚合初始化。

你有两个选择,要么使用push_back的,而不是emplace_back用大括号初始化列表:

voa.push_back({ 0, 0 });
Run Code Online (Sandbox Code Playgroud)

或者您可以使用std::array's (隐式)复制和移动构造函数并构造一个临时的std::array

voa.emplace_back(std::array<int>{0, 0}); // pre C++17
voa.emplace_back(std::array{0, 0});      // C++17
Run Code Online (Sandbox Code Playgroud)

最终这两种方法都应该生成相同的机器代码。


回应您的编辑:

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

不一样

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

{0, 0}是一个大括号初始化列表,它没有类型。这就是为什么您不能将它们用作模板化函数的参数的原因。有关更多详细信息,请参阅此问题