2013-02-10 82 views
3

下面的代码编译好与G ++ 4.7.2:使用数组作为元组成员:有效的C++ 11元组声明?

#include <tuple> 
std::tuple<float,int[2]> x; 

随着铛++ 3.2,然而,将产生下面的错误:

错误:数组初始化必须是一个初始化列表。

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

$ CXX -std = C++ 11 -c file.cpp

+4

GCC非地规范允许包含数组省略在初始化器列表语法外括号没有'='符号结构。我认为你不可以做数组的元组,因为数组是不可分配的。 – 2013-02-10 23:51:52

+0

今晚我不能重复错误。 – user2023370 2013-02-11 23:50:54

回答

2

我不认为这是在禁止你的宣言的标准什么。但是,只要尝试初始化,复制,移动或分配元组,就会遇到问题,因为对于这些操作,元组的所有成员类型必须能够用作初始值,可复制构造,可复制赋值和可移动赋值(§20.4.2.1)。这些都不是阵列的情况。

你会更好使用std::array而不是C风格的数组:

#include <tuple> 
#include <array> 
std::tuple<float,std::array<int,2> > x; 
+0

嗯。如果所有这些东西都不可能用于数组,我们是否真的认为该声明是有效的?至少不是CopyAssignable/MoveAssignable可能是成员类型的强制性要求? – 2013-02-11 00:19:56

+1

好的规则似乎都是局限于个体操作(20.4)。 – 2013-02-11 00:22:05

+1

@LightnessRacesinOrbit由于Standard定义了每个操作的需求(例如,只有在使用元组的复制构造函数时才需要CopyConstructible),我相信它不是Standard的明确要求(与向量相同的情况)。但如果我们有了概念,那么你可能是对的。 – jogojapan 2013-02-11 00:22:28