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



             Bug #: 55778

           Summary: Variadic template extension possibly wrong

    Classification: Unclassified

           Product: gcc

           Version: 4.7.1

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: c++

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: koal...@free.fr





with the code

#include <string>

#include <iostream>

template<typename ...Args>

void foo(Args ... args)

{

    std::cout<<"stopping with "<<sizeof...(args)<< " unused

arguments"<<std::endl;

}

template<typename ...Args>

void foo(int i, Args ... args)

{

    std::cout<<"using i = "<<i

             <<", left "<<sizeof...(args)<<" argument more"<<std::endl;

    foo(args...);

}

template<typename ... Args>

void foo(std::string const & s, Args...args)

{

    std::cout<<"using the "<<s<<" string, left "

             <<sizeof...(args)<<" argument more"<<std::endl;

    foo(args...);

}

int main()

{



    foo<int, int,int, int, std::string , int, int >(1, 2, 3, 4,5 ,

                                                   "hello", 6, 7 );

    return 0;

}



we get a result like

using i = 1, left 7 argument more

using i = 2, left 6 argument more

using i = 3, left 5 argument more

using i = 4, left 4 argument more

using i = 5, left 3 argument more

stopping with 3 unused arguments



but we could expect a result like 



using i = 1, left 7 argument more

using i = 2, left 6 argument more

using i = 3, left 5 argument more

using i = 4, left 4 argument more

using i = 5, left 3 argument more

using the hello string, left 2 argument more

using i = 6, left 1 argument more

using i = 7, left 0 argument more

stopping with 0 unused arguments



just like with the code 



#include <iostream>

#include <string>

template<typename ...Args>

void foo(int i, Args ... args);

template<typename ...Args>

void foo(std::string const & s, Args...args);

template<typename ...Args>

void foo(Args ... args)

{

    std::cout<<"stopping with "<<sizeof...(args)<< " unused

arguments"<<std::endl;

}

template<typename ... Args>

void foo(std::string const & s, Args...args)

{

    std::cout<<"using the "<<s<<" string, left "

             <<sizeof...(args)<<" argument more"<<std::endl;

    foo(args...);

}

template<typename ...Args>

void foo(int i, Args ... args)

{

    std::cout<<"using i = "<<i

             <<", left "<<sizeof...(args)<<" argument more"<<std::endl;

    foo(args...);

}

int main()

{



    foo<int, int,int, int, std::string , int, int >(1, 2, 3, 4,5 ,

                                                   "hello", 6, 7 );

    return 0;

}



Am i wrong ?

Reply via email to