Violation ODR lorsque le nom de nom trouve une déclaration différente
-
14-11-2019 - |
Question
J'ai pensé à ce qui suit. Considérez deux fichiers:
A.CPP:
template<class T> void g(T) {}
inline void f() { g(1); }
B.CP:
template<class T> void g(T) {}
void g(int) {}
inline void f() { g(1); }
Sans pour autant void g(int) {}
Ce programme est 100% valide. Avec void g(int) {}
, g(1)
se résout vers la version du modèle en A.CPP et sur le non-modèle de B.CPP.
Ce programme viole-t-il l'ODR? Pourquoi?
La solution
Oui. À l'exception pour inline
Fonctions Il est spécifié que non seulement les définitions de la fonction en ligne sont constituées exactement de la même séquence de jeton, mais que tous les identificateurs correspondants dans la définition de la fonction qui nomment des entités en dehors de la définition de la fonction doivent se référer à la même entité (à quelques exceptions mineures , comme se référer aux objets const avec liaison interne avec la même définition autorisée). [Voir ISO / IEC 14882: 2003 3.2 / 5