Cela semble être différent pour les différents compilateurs.
Mircosoft et Borland utilisent tous deux la version const char*, tandis que GNU donne le résultat que vous avez décrit.
Voici un extrait de la norme C++ :
14.8.2.1 Déduire les arguments du modèle à partir d'un appel de fonction [temp.deduct.call]
La déduction des arguments du modèle est effectuée par en comparant chaque modèle de fonction (appelé P) avec le type de paramètre type de l'argument correspondant de l'appel (appelé A) comme décrit ci-dessous.
Si P n'est pas un type de référence :
-- Si A est un type de tableau, le type de pointeur produit par la méthode array-to-pointer standard (4.2) est utilisée à la place de à la place de A pour la déduction de type ; sinon,
-- Si A est un type de fonction, le type de pointeur produit par le standard norme fonction-pointeur (4.3) est utilisé à la place de A pour la déduction de type ; sinon,
-- Si A est un type qualifié cv, les qualificateurs cv de niveau supérieur du type de A sont ignorés pour la déduction du type.
Si P est un type qualifié cv, le haut de page de niveau supérieur du type de P sont ignorés pour la déduction de type. Si P est un type de référence, le type auquel fait référence par P est utilisé pour la déduction de type
Le compilateur va construire un A
comme suit :
Argument: t d
A: char const[34] char[34]
Et la liste des paramètres P
:
Parameter: c t
P: char const* char const& t[N]
Par défaut, le compilateur doit choisir des paramètres non référencés. Pour une raison quelconque, GNU se trompe la deuxième fois.