C'est généralement une mauvaise idée de surcharger un modèle de fonction prenant un paramètre "T&&", car il peut se lier à n'importe quoi, mais supposons que nous le fassions quand même :
template<typename T>
void func(const T& param)
{
std::cout << "const T&\n";
}
template<typename T>
void func(T&& param)
{
std::cout << "T&&\n";
}
D'après ce que j'ai compris, le const T&
sera appelée pour les arguments qui sont des valeurs constantes, et la surcharge T&&
sera appelée pour tous les autres types d'arguments. Mais considérez ce qui se passe lorsque nous appelons func
avec des tableaux de contenus constants et non constants :
int main()
{
int array[5] = {};
const int constArray[5] = {};
func(array); // calls T&& overload
func(constArray); // calls const T& overload
}
VC10, VC11, et gcc 4.7 sont en accord avec les résultats indiqués. Ma question est de savoir pourquoi le deuxième appel invoque la fonction const T&
surcharge. La réponse simple est que constArray
a un const dedans, mais je pense que c'est trop simple. Le type T qui est déduit (indépendamment du modèle sélectionné) est "array of 5 const ints", donc le type de param
dans le const T&
La surcharge serait "référence à un tableau constant de 5 const ints". Mais le tableau nommé constArray n'est pas lui-même déclaré const. Alors pourquoi l'appel à func(constArray)
invoquer le T&&
ce qui permet d'obtenir un type pour param
de "référence à un tableau de 5 const ints" ?
Cette question est motivée par la discussion associée à la question à l'adresse suivante c++ template function argument deduce and function resolution mais je pense que ce fil de discussion a été détourné sur d'autres sujets et n'a pas clarifié la question que je pose maintenant ici.