如何放置到 std::vector 的 std::array?
How to emplace to a std::vector of std::array?
有了向量的向量,我可以这样做:
std::vector<std::vector<int>> vov;
vov.emplace_back(std::initializer_list<int>{0, 0});
但是,std::array 的向量等效失败:
std::vector<std::array<int, 2>> voa;
voa.emplace_back(std::initializer_list<int>{0,0});
在向量中放置数组的正确方法是什么?
编辑:
是的,您可以从 初始化列表 :
创建 std::array
std::array<int, 2> a = {0, 0}
工作正常。
错误:
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> &'
std::array
没有任何构造函数,它的初始化遵循聚合初始化。
你有两个选择,要么使用 push_back
而不是 emplace_back
和 brace-init-list:
voa.push_back({ 0, 0 });
或者您可以使用 std::array
的(隐式)复制和移动构造函数并构造一个临时的 std::array
:
voa.emplace_back(std::array<int>{0, 0}); // pre C++17
voa.emplace_back(std::array{0, 0}); // C++17
最终这两种方法应该生成相同的机器代码。
回应您的编辑:
std::array<int, 2> a = {0, 0};
与
不同
std::array<int, 2> a = std::initializer_list<int>{0, 0};
{0, 0}
是一个 brace-init-list,它没有类型。这就是为什么不能将它们用作模板函数的参数的原因。有关详细信息,请参阅 this question。
有了向量的向量,我可以这样做:
std::vector<std::vector<int>> vov;
vov.emplace_back(std::initializer_list<int>{0, 0});
但是,std::array 的向量等效失败:
std::vector<std::array<int, 2>> voa;
voa.emplace_back(std::initializer_list<int>{0,0});
在向量中放置数组的正确方法是什么?
编辑:
是的,您可以从 初始化列表 :
std::array<int, 2> a = {0, 0}
工作正常。
错误:
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> &'
std::array
没有任何构造函数,它的初始化遵循聚合初始化。
你有两个选择,要么使用 push_back
而不是 emplace_back
和 brace-init-list:
voa.push_back({ 0, 0 });
或者您可以使用 std::array
的(隐式)复制和移动构造函数并构造一个临时的 std::array
:
voa.emplace_back(std::array<int>{0, 0}); // pre C++17
voa.emplace_back(std::array{0, 0}); // C++17
最终这两种方法应该生成相同的机器代码。
回应您的编辑:
std::array<int, 2> a = {0, 0};
与
不同std::array<int, 2> a = std::initializer_list<int>{0, 0};
{0, 0}
是一个 brace-init-list,它没有类型。这就是为什么不能将它们用作模板函数的参数的原因。有关详细信息,请参阅 this question。