2013-02-10 59 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