Bonjour,

Je me demande pourquoi mes compilateurs (gcc 4.3, et cl de visual c++ 2005) m'instancie cette fonction :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
void f(int & val)
{
   std::cout << val << std::endl;
}
dans ce cas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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