[Bug c++/45873] Parameter packs not expanding consistently in function return types

redi at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon May 16 12:28:00 GMT 2011


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45873

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jason at gcc dot gnu.org

--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> 2011-05-16 12:01:31 UTC ---
Jason, should deduction succeed here?

template<class, class>
struct pair
{
    template<class T1, class U1>
        pair(T1&& t, U1&& u) { }
};

template <template <class...> class T, class ...Args>
auto foo(Args... args) -> T<Args...>
{ return T<Args...>(args...); }

int main()
{
   // error: no matching function for call to 'foo(int, double)'
   foo<pair>(1, 2.0);
}


It looks as though substituting T=pair fails because T's single parameter pack
fails to match pair's two parameters.

If pair is a variadic template with exactly one parameter pack , like p0 below,
then it matches T:

template<class...> struct p0 { };

template<class, class...> struct p1 { };

template<class, class, class...> struct p2 { };

template <template <class...> class T, class ...Args>
auto foo(Args... args) -> T<Args...>
{ return T<Args...>(); }

int main()
{
   foo<p0>(1, 2.0);  // ok
   foo<p1>(1, 2.0);  // error
   foo<p2>(1, 2.0);  // error
}

Is this behaviour correct?

Clang accepts all three calls



More information about the Gcc-bugs mailing list