将数组用作元组成员:C++11中有效的元组声明?

4
以下代码在G++ 4.7.2下编译正常:
#include <tuple>
std::tuple<float,int[2]> x;

然而,使用clang++ 3.2编译时,会产生以下错误:

error: 数组初始化必须是初始化列表。

如果我从元组声明中删除float类型,则该错误消失。上述元组声明是否有效?

($CXX -std=c++11 -c file.cpp)


4
GCC在结构体包含数组的情况下,允许省略初始化器列表中外侧的花括号而不需要加上等号。我认为你不能将数组作为元组,因为数组是不可赋值的。 - Seth Carnegie
今晚我不能重复这个错误。 - user2023370
1个回答

4
我认为标准中没有禁止你的声明。但是,一旦您尝试初始化、复制、移动或分配元组,就会遇到问题,因为对于这些操作,元组的所有成员类型都必须能够用作初始化器、可复制构造、可复制分配和可移动分配 (§20.4.2.1)。而这些条件在数组中都无法满足。
相比使用C风格数组,您最好使用std::array
#include <tuple>
#include <array>
std::tuple<float,std::array<int,2> > x;

嗯。如果所有这些对于数组来说都不可能,我们真的认为声明是有效的吗?至少成员类型需要具备可复制/可移动赋值的要求吧? - Lightness Races in Orbit
1
好的,规则似乎都是针对单个操作(20.4)本地化的。 - Lightness Races in Orbit
1
@LightnessRacesinOrbit 我认为这不是标准的显式要求(与向量的情况相同),因为标准按操作定义要求(例如,只有在使用元组的复制构造函数时才需要CopyConstructible)。但是,如果我们有_concepts_,那么你可能是正确的。 - jogojapan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接