Cela vient juste d'être soulevé dans le contexte d' une autre question .
Apparemment, les fonctions membres des modèles de classe ne sont instanciées que si elles sont utilisées par ODR. Quelqu'un pourrait-il expliquer ce que cela signifie exactement. L' article de wikipedia sur One Definition Rule (ODR) ne mentionne pas " ODR-use ".
Cependant, la norme le définit comme
Une variable dont le nom apparaît comme une expression potentiellement évaluée est utilisée par odr à moins qu'il ne s'agisse d'un objet qui satisfait aux exigences pour apparaître dans une expression constante (5.19) et que la conversion lvalue-en-rvalue (4.1) est immédiatement appliquée.
dans [basic.def.odr].
Edit: Apparemment, ce n'est pas la bonne partie et le paragraphe entier contient plusieurs définitions pour différentes choses. Cela peut être le plus pertinent pour la fonction membre du modèle de classe:
Une fonction non surchargée dont le nom apparaît comme une expression potentiellement évaluée ou un membre d'un ensemble de fonctions candidates, si elle est sélectionnée par résolution de surcharge lorsqu'elle est référencée à partir d'une expression potentiellement évaluée, est utilisée par odr, sauf s'il s'agit d'un pur virtuel fonction et son nom ne sont pas explicitement qualifiés.
Je ne comprends cependant pas, comment cette règle fonctionne sur plusieurs unités de compilation? Toutes les fonctions membres sont-elles instanciées si j'instancie explicitement un modèle de classe?