Est-il judicieux d’utiliser un mot clé en ligne avec des modèles?

Puisque les modèles sont définis dans les en-têtes et que le compilateur est capable de déterminer si l’inclusion d’une fonction est avantageuse, cela at-il un sens? J’ai entendu dire que les compilateurs modernes savent mieux quand insérer une fonction et ignorent l’indicateur intégré.


edit: Je voudrais accepter les deux réponses, mais ce n’est pas possible. Pour clore le problème, j’accepte la réponse de Phresnel , car elle a reçu le plus de votes et il a formellement raison, mais comme je l’ai mentionné dans les commentaires, je considère que les réponses de Puppy et Component 10 sont également correctes, d’un sharepoint vue différent. .

Le problème réside dans la sémantique C ++, qui n’est pas ssortingcte en cas de mots clés en inline et d’inclusion. phresnel dit “écrivez en ligne si vous le voulez”, mais ce que l’on entend par inline n’est pas clair car il a évolué de son sens original à une directive qui “arrête les compilateurs de violations de l’ODR”.

Ce n’est pas sans importance. Et non, tous les modèles de fonctions ne sont pas inline par défaut. La norme est même explicite à ce sujet dans la spécialisation Explicit ([temp.expl.spec])

Avoir ce qui suit:

a.cc

 #include "tpl.h" 

b.cc

 #include "tpl.h" 

tpl.h (tiré de la spécialisation explicite):

 #ifndef TPL_H #define TPL_H template void f(T) {} template inline T g(T) {} template<> inline void f<>(int) {} // OK: inline template<> int g<>(int) {} // error: not inline #endif 

Comstackz ceci, et voilà:

 g++ a.cc b.cc /tmp/ccfWLeDX.o: In function `int g(int)': inlinexx2.cc:(.text+0x0): multiple definition of `int g(int)' /tmp/ccUa4K20.o:inlinexx.cc:(.text+0x0): first defined here collect2: ld returned 1 exit status 

Ne pas indiquer en inline lors d’une instanciation explicite peut également entraîner des problèmes.

Donc, en résumé : Pour les modèles de fonctions non entièrement spécialisés, c’est-à-dire ceux qui contiennent au moins un type inconnu, vous pouvez omettre en inline et ne pas recevoir d’erreurs, mais ils ne sont toujours pas en inline . Pour les spécialisations complètes, c’est-à-dire celles qui utilisent uniquement des types connus, vous ne pouvez pas l’omettre.

Règle de base proposée : Écrivez en inline si vous le voulez et soyez juste cohérent. Cela vous fait moins réfléchir à la question de savoir si vous le pouvez ou non. (Cette règle de base est conforme au modèle C ++ de Vandevoorde / Josuttis : le guide complet ).

C’est sans importance. Tous les modèles sont déjà en inline , sans compter qu’en 2012, la seule utilisation du mot-clé en inline est d’empêcher les compilateurs de se plaindre des violations de l’ODR. Vous avez tout à fait raison, votre compilateur de la génération actuelle saura ce qu’il doit incorporer et pourra probablement le faire même entre les unités de traduction.

Comme vous l’avez suggéré, inline est une indication pour le compilateur et rien de plus. Il peut choisir de l’ignorer ou, en fait, d’inclure des fonctions non marquées en ligne.

Utiliser inline avec des modèles était un moyen (médiocre) de contourner le problème, à savoir que chaque unité de compilation créerait un object distinct pour la même classe de modèles, ce qui provoquerait des problèmes de duplication au moment du lien. En utilisant inline (je pense), le nom se déroule différemment, ce qui contourne le conflit de nom au moment du lien, mais au désortingment d’un code très lourd.

Marshall Cline l’ explique mieux que moi.