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 ?