Lors de la construction d'un petit exemple de programme avec Microsoft VisualStudio 2008, j'ai remarqué une chose étrange au sujet de la déduction des types passés aux modèles. Considérez cet exemple:Pourquoi les qualificatifs des arguments de modèle sont-ils supprimés lors de la déduction du type?
template<class T>
void f(T v) {
x; // trigger a compile error
(void)v;
}
template<class T>
void g(T v) {
f(v);
}
void h() {
int i;
g<const int &>(i);
}
cet exemple en utilisant Compiler cl /c foo.cpp
engendre une erreur de compilation (comme prévu). Ce qui est intéressant, c'est la valeur du paramètre de template 'T'. Voici ce que VisualStudio 2008: impressions
mini.cpp(3) : error C2065: 'x' : undeclared identifier
mini.cpp(9) : see reference to function template instantiation 'void f<int>(T)' being compiled
with
[
T=int
]
mini.cpp(14) : see reference to function template instantiation 'void g<const int&>(T)' being compiled
with
[
T=const int &
]
Notez comment dans g
, le type de l'argument est const int &
mais f
il est juste int
. Apparemment, la partie reference-to-const a été supprimée tout en déduisant le type à utiliser lors de l'instanciation du modèle f
. Lors du réglage de l'exemple pour que f
est appelé comme
f<T>(v);
le type est const int &
dans les deux f
et g
. Pourquoi donc? Est-ce un comportement spécifié? Je me suis secrètement appuyé sur le type de l'argument de la fonction v
à passer à f
mais apparemment ce n'est pas le cas.
'Modèles C++' + MSVC++ = Mauvaise combinaison. –
@Prasoon: GCC en déduit le même type.Bien sûr, dans GCC, le code du questionneur déclenche une erreur de compilation dans 'f' le modèle, avant qu'il ne soit presque question de l'instancier, car GCC effectue correctement la compilation en deux phases. 'x' ne dépend pas d'un paramètre de template, donc devrait être rejeté dans la première phase (comme dans GCC), pas dans la seconde (comme dans MSVC). Mais changez 'x' en' v = 1; ', et il est facile de voir que GCC n'instancie' f' avec 'const int &' que si vous spécifiez explicitement 'f (v)' in 'g'. –