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.

Reply via email to