3

次の関数 はtoArray、いつか C++11 を C++11 に変換する可能性がありstd::tupleますstd::array

#include <tuple>
#include <array>

template <typename T, typename ...U>
std::array<T,sizeof...(U)>
toArray(std::tuple<U...>) {
  return std::array<T,sizeof...(U)>();
}

次のコードで呼び出そうとするとtoArray、G++ 4.8 で正常にコンパイルできます。ただし、Clang++ 3.2 でコンパイルすると、Clang フロントエンドがクラッシュします。私のコードは有効な C++ ですか?

int main(int argc, char *argv[])
{
  auto tup = std::make_tuple(1,2,3,4,5,6,7,8);
  toArray<int>(tup);
  return 0;
}
4

1 に答える 1

1

それは私には有効に見え、完成したバージョンは G++ で正常に動作します:

#include < redi/index_tuple.h >
template <typename T, typename... U, unsigned... N>
  std::array<T, sizeof...(U)>
  toArray2(std::tuple<U...>& t, redi::index_tuple<N...>) {
    return std::array<T, sizeof...(U)>{{ std::get<N>(t)... }};
  }

template <typename T, typename ...U>
  std::array<T, sizeof...(U)>
  toArray(std::tuple<U...> t) {
    return toArray2<T>(t, redi::to_index_tuple<U...>{});
  }

int main()
{
  auto tup = std::make_tuple(1,2,3,4,5,6,7,8);
  return toArray<int>(tup)[3] - 4;
}
于 2012-10-18T23:56:54.393 に答える