【问题标题】:emplace_back to std::vector<std::array> not works [duplicate]emplace_back 到 std::vector<std::array> 不起作用[重复]
【发布时间】:2021-06-21 11:55:29
【问题描述】:

我想知道这么简单的程序不能用gcc、clang和msvc编译:

#include <array>
#include <vector>

int main()
{
    std::vector<std::array<int, 3>> v;
    v.emplace_back( 1, 2, 3 );
    return 0;
}

为什么 std::array 不能从值序列构造?使用可变参数通用引用编写自定义 ctor 以有效地从值构造 std::array 看起来很容易。

我认为如果 std::array 被认为是 POD 结构会很好。

【问题讨论】:

  • @ShadowRanger 链接的骗子根本没有回答问题。
  • @Evg:它没有回答什么?它准确地说明了问题是什么以及为什么它不能工作(它是一个没有用户定义构造函数的聚合)。它涵盖了明显的替代尝试(通过{1, 2, 3},这也不起作用)。除了这些之外,这里唯一的问题基本上是“为什么 C++ 标准委员会不做我想做的事?”这不是一个有用的问题(徘徊在基于意见和缺陷报告之间的某个地方,在 StackOverflow 上都没有)。
  • 问题表明 OP 已经知道这一点。真正的问题是为什么std::array 没有可以使emplace_back 工作的可变参数构造函数。骗子没有回答这个问题。这是否是一个有用的问题是一个完全不同的故事。诸如“为什么 C++ 标准委员会不做我想做的事?”之类的问题。并不总是基于意见。远非如此。
  • “我认为如果 std::array 被认为是 POD 结构会很好。” 这实际上是问题...std::array&lt;int, 3&gt; arr(1, 2, 3); 无效.
  • @Jarod42:POD 不是直接相关的吗? std::array can be POD(如果没有实现对标准的扩展),但即使是这样,std::array&lt;int, 3&gt; arr(1, 2, 3); 也不会适用。它是int[3] 的包装,而不是三个ints; std::array&lt;int, 3&gt; arr({1, 2, 3})std::array&lt;int, 3&gt; arr{1, 2, 3} 在 GCC 上是合法的,但 emplace_back({1, 2, 3}) 不起作用,因为大括号初始化器不能通过函数调用工作,函数调用使用 std::initializer_list 而不是聚合 init,并且只有在接收类型支持它时。

标签: c++ stdarray emplace


【解决方案1】:

您正在尝试将整数放入std::vector,而不是您定义的std::array&lt;int, 3&gt;。目前尚不清楚v.emplace_back( 1, 2, 3 ); 的用途。它是指 std::array&lt;int, 3&gt;{ 1, 2, 3 } 作为向量中的一项还是表示 { std::array&lt;int, 3&gt;{ 1, 1, 1 }, std::array&lt;int, 3&gt;{ 2, 2, 2 }, std::array&lt;int, 3&gt;{ 3, 3, 3 } } 或其他什么?

【讨论】:

    猜你喜欢
    • 2017-09-21
    • 2017-01-12
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多