Variadic template : ai-je loupé quelque chose ou est-ce un bug?
Salut,
En préparant une réponse à cette discussion, j'ai été confronté à un comportement qui me semble étrange de la part de gcc...
En effet, si j'exécute le code
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
#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 ,
"salut", 6, 7 );
return 0;
} |
l'exécution s'arrpête après avoir utiliser l'argument "salut", en me disant qu'il reste 2 arguments inutilisés.
Par contre, si je rajoute une déclaration des fonctions sous la forme de
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #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 ,
"salut", 6, 7 );
return 0;
} |
l'exécution va jusqu'à son terme...
Je me serais pourtant attendu, étant donné que la définition de fonction vaut déclaration, à ce que le premier code fonctionne correctement !!!
Alors, selon vous, aurais-je loupé quelque chose, ou s'agit-il d'un bug de gcc :question: