This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug regression/48320] New: [C++0x] cannot expand template parameter pack in Default template arguments
- From: "gintensubaru at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 28 Mar 2011 18:35:25 +0000
- Subject: [Bug regression/48320] New: [C++0x] cannot expand template parameter pack in Default template arguments
- Auto-submitted: auto-generated
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: unassigned@gcc.gnu.org
ReportedBy: gintensubaru@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.