Étant donné que les modèles sont définis dans les en-têtes et que le compilateur est capable de déterminer si l'intégration d'une fonction est avantageuse, cela a-t-il un sens? J'ai entendu dire que les compilateurs modernes savent mieux quand intégrer une fonction et ignorent les inline
indices.
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 la plupart des votes et il a formellement raison, mais comme je l'ai mentionné dans les commentaires, je considère les réponses de Puppy et Component 10 comme correctes aussi, d'un point de vue différent .
Le problème est dans la sémantique C ++, qui n'est pas stricte en cas de inline
mot clé et d'inlining. phresnel dit «écrivez en ligne si vous l'entendez», mais ce que l'on entend par là inline
n'est pas clair car il a évolué de sa signification originale à une directive qui «empêche les compilateurs de se plaindre des violations des ODR» comme le dit Puppy .
inline
simplement parce que le modèle qui était spécialisé est marqué avecinline
. Doncinline
, le modèle est complètement hors de propos. Que cette fonction soitinline
ou non n'a rien à voir avec sa génération via une spécialisation de modèle (et il y a de meilleures réponses que celle-ci: quand l'utiliserinline
). La réponse de @Puppy ci-dessous est correcte, celle-ci ne l'est pas. L'ajoutinline
d'un modèle n'est pas pertinent etclang-tidy
le supprimera en fait.inline
n'est pas sans importance, l'exemple doit couvrir le cas d'une spécialisation explicitetemplate<> void f<>(int) {}
sans leinline
mot - clé. Mais même dans ce cas, la modification duinline
spécificateur sur le modèle ne fait aucune différence, car le fait de marquerinline
ou non le modèle n'a pas d'importance.Ce n'est pas pertinent. Tous les modèles le sont déjà
inline
- sans oublier qu'à partir de 2012, la seule utilisation duinline
mot-clé est d'empêcher les compilateurs de se plaindre des violations de l'ODR. Vous avez tout à fait raison - votre compilateur de génération actuelle saura tout seul ce qu'il faut insérer et peut probablement le faire même entre les unités de traduction.la source
inline
fonctions marquées (c'est-à-dire que plusieurs définitions équivalentes peuvent être passées à l'éditeur de liens, qui en sélectionnera une). Telle est la fonction réelle duinline
mot - clé , et non pas en ligne .inline
. Jetez peut-être un coup d'œil à ma réponse ci-dessous (ou ci-dessus, selon le tri choisi). Pour les modèles non spécialisés, vous avez bien sûr raison, mais ce n'est formellement pas la même chose.inline
ce qui est censé être en ligne. Cela ne fait généralement aucune différence, mais en standard, ils ne sont pas identiques et ils ne sont pas tous en ligne. J'accepte votre position à ce sujet en disant "Ce n'est pas pertinent", mais selon la norme, tous les modèles ne sont pas en ligne, seulement pour vous en tant qu'utilisateur C ++ - ils apparaissent comme si.Comme vous l'avez suggéré,
inline
c'est un indice pour le compilateur et rien de plus. Il peut choisir de l'ignorer ou, en fait, des fonctions en ligne non marquées en ligne.Utiliser
inline
avec des modèles était un moyen (médiocre) de contourner le problème que chaque unité de compilation créerait un objet séparé pour la même classe de modèle, ce qui causerait alors des problèmes de duplication au moment de la liaison. En utilisantinline
(je pense) le nom mangling fonctionne différemment, ce qui contourne le conflit de nom au moment de la liaison, mais au détriment d'un code extrêmement gonflé.Marshall Cline l' explique ici mieux que moi.
la source
§14.5.5.1 p7 & p8
). Mon mauvais, j'ai supprimé le mauvais commentaire.