Il ne fait aucun sens d'utiliser mot-clé inline avec des modèles?
Depuis les modèles sont définis dans les en-têtes et le compilateur est capable de déterminer si une fonction inline est avantageux, sera-t-elle un sens? J'ai entendu dire que les compilateurs modernes savent mieux lorsque incorporer une fonction et sont ignorant inline
soupçon.
edit: je tiens à accepter à la fois les réponses, mais ce n'est pas possible. Pour fermer le problème j'admets phresnel's réponse, car il a reçu le plus de votes, et il est formellement droit, mais comme je l'ai mentionné dans les commentaires je considère Chiot's et Composant 10's réponses correctes aussi, à partir d'un autre point de vue.
Le problème est en C++ sémantique, qui n'est pas stricte dans le cas de inline
et de mot-clé inline. phresnel dit "écrire inline si vous l'entendez, mais ce qui est fait par inline
n'est pas clair qu'il a évolué à partir de son sens originel à une directive qui "arrête de compilateurs à râler à propos de l'ODR violations" en tant que Chiot dit.
Vous devez vous connecter pour publier un commentaire.
Il n'est pas pertinent. Et non, pas tous les modèle de fonction est
inline
par défaut. La norme est même explicite à ce sujet dans Explicite spécialisation ([temp.expl.spec])Sont les suivantes:
a.cc
b.cc
tpl.h (prises de Spécialisation Explicite):
La compilation, et le tour est joué:
N'indiquant pas la
inline
lors explicite de l'instanciation peut aussi conduire à des problèmes.Donc en résumé: Pour les non spécialisée modèles de fonction, c'est à dire ceux qui possèdent au moins un type inconnu, vous pouvez omettre
inline
, et de ne pas recevoir des erreurs, mais encore ils ne sont pasinline
. Pour plein de spécialisations, c'est à dire ceux qui utilisent uniquement des types connus, vous ne pouvez pas omettre.La proposition de règle de pouce: Écrire
inline
si vous voulez dire et d'être cohérente. Il vous fait penser à moins de savoir si ou de ne pas seulement parce que vous le pouvez. (Cette règle est conforme à Vandevoorde s/Josuttis du C++ Template: Le Guide Complet).template<class T> inline T g(T) {}
inline n'est pas nécessaire et vous pourriez avoir écrittemplate<class T> T g(T) {}
inline
juste parce que vous pouvez, puis ré-introduction lorsque vous devez. Je préfère vraiment dire inline quand vous l'entendez.inline
pour un modèle?mov eax, alpha
pour une plus. Avec les non-inline modèle de fonctions, je veux les mêmes avantages que les non en ligne non-modèle de fonctions.inline
simplement parce que le modèle qui a été spécialisée est marqué avecinline
. Doncinline
sur le modèle est complètement hors de propos. Si cette fonction doit êtreinline
ou pas n'a rien à faire du fait qu'elle est générée par un modèle de spécialisation (et il y a des réponses de meilleure qualité que ce que l'adresse lors de l'utilisation deinline
). @Chiot 's réponse ci-dessous est correct, celui-ci ne l'est pas. L'ajout deinline
sur un modèle n'est pas pertinent, etclang-tidy
sera effectivement le supprimer.inline
est pas hors de propos, l'exemple devrait couvrir les cas explicitement spécialiséetemplate<> void f<>(int) {}
sans leinline
mot-clé. Mais même alors, la modification de lainline
spécificateur sur le modèle ne fait aucune différence, parce que si vous marquez le modèleinline
ou non n'est pas pertinent.C'est sans importance. Tous les modèles sont déjà
inline
- pour ne pas mentionner que, à compter de 2012, la seule utilisation de lainline
mot-clé est d'arrêter les compilateurs de râler sur le RLL violations. Vous avez absolument raison - votre génération actuelle compilateur de savoir quoi inline sur c'est propre et peut probablement le faire, même entre les unités de traduction.inline
marqué fonctions (qui est, plusieurs définitions équivalentes peuvent être transmises à l'éditeur de liens, qui permet de sélectionner un). Que, pas l'in-lining, est la véritable fonction de l'inline
mot-clé.inline
. Peut-être avoir un coup d'oeil à ma réponse ci-dessous (ou au-dessus, selon le tri). Pour les non-des modèles spécialisés, vous êtes bien sûr le droit, mais il est officiellement pas la même.inline
un, afin de savoir si ou non la Norme précise qu'il n'est pas pertinent.inline
ce qui est censé être en ligne. Habituellement, il ne fait aucune différence, mais dans standardese, ils ne sont pas les mêmes, et ils ne sont pas en ligne. J'accepte votre position sur elle en disant: "C'est sans importance", mais par la norme, pas tous les modèles sont en ligne, seulement pour vous en tant que C++-utilisateur, ils apparaissent comme si.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 effet, de fonctions inline n'est pas marqué sur la ligne.À l'aide de
inline
avec des modèles utilisés pour être une (mauvaise) façon de contourner le problème que chaque unité de compilation serait de créer un objet distinct pour la même basé sur un modèle de classe qui serait alors causer des problèmes de duplication au moment de la liaison. En utilisantinline
(je pense) le nom d'amputation des œuvres différentes qui contourne le conflit de nom au moment de la liaison, mais au détriment de la très gonflé code.Marshall Cline il explique ici mieux que je peux.
§14.5.5.1 p7 & p8
). My bad, j'ai enlevé le mauvais commentaire.