【发布时间】: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<int, 3> arr(1, 2, 3);无效. -
@Jarod42:POD 不是直接相关的吗?
std::arraycan be POD(如果没有实现对标准的扩展),但即使是这样,std::array<int, 3> arr(1, 2, 3);也不会适用。它是int[3]的包装,而不是三个ints;std::array<int, 3> arr({1, 2, 3})和std::array<int, 3> arr{1, 2, 3}在 GCC 上是合法的,但emplace_back({1, 2, 3})不起作用,因为大括号初始化器不能通过函数调用工作,函数调用使用std::initializer_list而不是聚合 init,并且只有在接收类型支持它时。