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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top