Instanciation de fonction template et temporaire
Bonjour,
Je me demande pourquoi mes compilateurs (gcc 4.3, et cl de visual c++ 2005) m'instancie cette fonction :
Code:
1 2 3 4
| void f(int & val)
{
std::cout << val << std::endl;
} |
dans ce cas :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
#include <iostream>
template<typename T>
void f(T & val)
{
std::cout << val << std::endl;
}
int main()
{
f(int(0));
} |
Forcément, avec cette instanciation le code ne peux pas compiler.
Pourquoi le compilateur n'instancie pas cette fonction quand on lui passe un temporaire ?
Code:
1 2 3 4
| void f(int const & val)
{
std::cout << val << std::endl;
} |
Avec ce comportement, mes compilateurs m'obligent à fournir deux versions de fonction template pour gérer le cas du temporaire :
Code:
1 2 3 4 5 6 7 8 9 10
| template<typename T>
void f(T & val)
{
std::cout << val << std::endl;
}
template<typename T>
void f(T const & val)
{
std::cout << val << std::endl;
} |
Y'a t il un moyen de factoriser ce genre de code ?
ps : ma fonction f n'est qu'un exemple ultra simplifié ... et effectivement dans ce cas précis la version const suffirait, mais ma question porte sur le cas général ;)