http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48320
Summary: [C++0x] cannot expand template parameter pack in Default template arguments Product: gcc Version: 4.6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: regression AssignedTo: unassig...@gcc.gnu.org ReportedBy: gintensub...@gmail.com Source File (bug.cc): #include <tuple> #include <type_traits> #include <utility> template< std::size_t... Indices > struct indices {}; template< class Tuple, std::size_t... Indices, class Result = std::tuple< typename std::tuple_element< Indices, typename std::decay<Tuple>::type >::type... > > Result f( Tuple && t, indices<Indices...> ) { return Result( std::forward<typename std::tuple_element<Indices, Tuple>::type>( std::get<Indices>(t) )... ); } #include <cassert> int main() { auto t = f( std::make_tuple( 1, 2, 3 ), indices<2, 1, 0>() ); assert( std::get<0>(t) == 3 ); assert( std::get<1>(t) == 2 ); assert( std::get<2>(t) == 1 ); } Message: compiling and running file 'bug.cc'... bug.cc: In function ‘int main()’: bug.cc:28:62: error: no matching function for call to ‘f(std::tuple<int, int, int>, indices<2u, 1u, 0u>)’ bug.cc:28:62: note: candidate is: bug.cc:15:43: note: template<class Tuple, unsigned int ...Indices, class Result> Result f(Tuple&&, indices<Indices ...>) bug.cc:28:62: error: unable to deduce ‘auto’ from ‘<expression error>’ Note: #include <tuple> #include <type_traits> #include <utility> template< std::size_t... Indices > struct indices {}; template< class Tuple, std::size_t... Indices > std::tuple< typename std::tuple_element< Indices, typename std::decay<Tuple>::type >::type... > f( Tuple && t, indices<Indices...> ) { typedef std::tuple< typename std::tuple_element< Indices, typename std::decay<Tuple>::type >::type... > Result; return Result( std::forward<typename std::tuple_element<Indices, Tuple>::type>( std::get<Indices>(t) )... ); } #include <cassert> int main() { auto t = f( std::make_tuple( 1, 2, 3 ), indices<2, 1, 0>() ); assert( std::get<0>(t) == 3 ); assert( std::get<1>(t) == 2 ); assert( std::get<2>(t) == 1 ); } is OK.