4

以下のコードは、G++4.7.2で正常にコンパイルされます。

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

ただし、clang ++ 3.2では、次のエラーが発生します。

エラー:配列初期化子は初期化子リストである必要があります。

タプル宣言から型を削除するfloatと、エラーは消えます。上記のタプル宣言は有効ですか?

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

4

1 に答える 1

4

規格にはあなたの宣言を禁止するものは何もないと思います。ただし、タプルを初期化、コピー、移動、または割り当てるとすぐに問題が発生します。これらの操作では、タプルのすべてのメンバータイプを初期化子として使用でき、コピー構築可能、コピー割り当て可能である必要があるためです。それぞれ、move-assignable(§20.4.2.1)。これはいずれもアレイには当てはまりません。

std::arrayCスタイルの配列の代わりに使用する方が良いでしょう:

#include <tuple>
#include <array>
std::tuple<float,std::array<int,2> > x;
于 2013-02-11T00:16:29.947 に答える