【问题标题】:How to emplace to a std::vector of std::array?如何安置到 std::array 的 std::vector?
【发布时间】:2020-12-02 16:56:19
【问题描述】:

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

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});

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

编辑:

是的,您可以从 initializer list 创建 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 没有要转发到的 emplace_back 的 ctor。
  • 我想在这里你可以找到它为什么不起作用:stackoverflow.com/questions/8192185/…

标签: c++ stdvector stdarray emplace


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2011-05-24
    • 2014-08-20
    • 2020-05-21
    • 2013-09-27
    • 1970-01-01
    • 2016-06-15
    相关资源
    最近更新 更多