以下のコードは、G++4.7.2で正常にコンパイルされます。
#include <tuple>
std::tuple<float,int[2]> x;
ただし、clang ++ 3.2では、次のエラーが発生します。
エラー:配列初期化子は初期化子リストである必要があります。
タプル宣言から型を削除するfloat
と、エラーは消えます。上記のタプル宣言は有効ですか?
($ CXX -std = c ++ 11 -c file.cpp)
規格にはあなたの宣言を禁止するものは何もないと思います。ただし、タプルを初期化、コピー、移動、または割り当てるとすぐに問題が発生します。これらの操作では、タプルのすべてのメンバータイプを初期化子として使用でき、コピー構築可能、コピー割り当て可能である必要があるためです。それぞれ、move-assignable(§20.4.2.1)。これはいずれもアレイには当てはまりません。
std::array
Cスタイルの配列の代わりに使用する方が良いでしょう:
#include <tuple>
#include <array>
std::tuple<float,std::array<int,2> > x;