À l'aide de la dernière version de la norme C++ Actuellement n4582.
Dans la section 14.6 (p10), il est dit que le nom est lié au point de la déclaration si le nom n'est pas dépendant d'un paramètre du modèle. Si elle dépend d'un paramètre de modèle cela est défini dans la section 14.6.2.
Section 14.6.2.2 revient à dire que l'expression est dépendante du type si toute sous-expression est dépendante du type.
Maintenant, depuis l'appel à l' f()
dépend de son paramètre. Vous regardez le type de paramètre pour voir si c'est selon le type. Le paramètre False<T>::value ? d : d
. Ici, la première condition est fonction du type T
.
Par conséquent, nous concluons que l'appel est lié au moment de l'instanciation pas de déclaration. Et, par conséquent, doit se lier à: void f(Derived &) { std::cout << "f(Derived&)\n"; }
Donc g++ a le plus précis de mise en œuvre.
14.6 la résolution de Nom [temp.res]
Par 10:
Si un nom ne dépend pas d'un modèle à paramètre (tel que défini dans 14.6.2), une déclaration (ou d'un ensemble de déclarations) pour que le nom doit être portée au point où le nom apparaît dans la définition de modèle; le nom est lié à la déclaration (ou déclarations) trouvé à ce point, et cette liaison n'est pas affecté par des déclarations qui sont visibles au moment de l'instanciation.
14.6.2.2 en fonction du Type d'expressions [temp.dep.expr]
Sauf comme il est décrit ci-dessous, une expression est dépendant du type si toute sous-expression est dépendant du type.