Ponieważ szablony są zdefiniowane w nagłówkach, a kompilator jest w stanie określić, czy wstawianie funkcji jest korzystne, czy ma to jakiś sens? Słyszałem, że współczesne kompilatory wiedzą lepiej, kiedy wstawić funkcję i ignorują inline
wskazówkę.
edycja: chciałbym zaakceptować obie odpowiedzi, ale nie jest to możliwe. Aby zamknąć sprawę, przyjmuję odpowiedź phresnela , ponieważ otrzymał on najwięcej głosów i formalnie ma on rację, ale jak wspomniałem w komentarzach, uważam, że odpowiedzi Szczenięcia i Komponentu 10 również są poprawne, z innego punktu widzenia .
Problem tkwi w semantyce C ++, która nie jest ścisła w przypadku inline
słów kluczowych i inliningu. phresnel mówi „pisz w tekście , jeśli masz to na myśli”, ale to, co właściwie oznacza, inline
nie jest jasne, ponieważ ewoluowało od pierwotnego znaczenia do dyrektywy, która „powstrzymuje kompilatory narzekanie na naruszenia ODR”, jak mówi Puppy .
inline
tylko dlatego, że wyspecjalizowany szablon jest oznaczonyinline
. Więcinline
na szablonie jest całkowicie nieistotne. To, czy ta funkcja powinna być,inline
czy nie, nie ma nic wspólnego z generowaniem jej przez specjalizację szablonu (a są lepsze odpowiedzi niż ten adres, kiedy należy jej użyćinline
). Odpowiedź @Puppy poniżej jest poprawna, ta nie. Dodanieinline
do szablonu jest nieistotne iclang-tidy
faktycznie go usunie.inline
nie jest bez znaczenia, przykład powinny obejmować przypadku wyraźnie specjalizujący siętemplate<> void f<>(int) {}
bez tejinline
hasła. Ale nawet wtedy zmianainline
specyfikatora w szablonie nie robi żadnej różnicy, ponieważ to, czy zaznaczysz szablon,inline
czy nie, nie ma znaczenia.To nieistotne. Wszystkie szablony już są
inline
- nie wspominając, że od 2012 roku jedynym zastosowanieminline
słowa kluczowego jest zatrzymanie kompilatorów narzekających na naruszenia ODR. Masz absolutną rację - Twój kompilator obecnej generacji sam wie, co wstawić i prawdopodobnie może to zrobić nawet między jednostkami tłumaczeniowymi.źródło
inline
funkcje ze znakiem -mark (to znaczy, wiele równoważnych definicji może być przekazanych do konsolidatora, który wybierze jedną). To, a nie inlining, jest prawdziwą funkcjąinline
słowa kluczowego.inline
. Może rzuć okiem na moją odpowiedź poniżej (lub powyżej, w zależności od wybranego sortowania). W przypadku szablonów niespecjalistycznych masz oczywiście rację, ale formalnie to nie to samo.inline
tego, co powinno być w tekście. Zwykle nie ma to znaczenia, ale w standardowym języku nie są one takie same i nie wszystkie są wbudowane. Akceptuję Twoje stanowisko mówiąc „To nieistotne”, ale zgodnie ze standardem nie wszystkie szablony są wbudowane, tylko dla Ciebie jako użytkownika C ++ - wyglądają tak, jakby.Jak zasugerowałeś,
inline
jest wskazówką dla kompilatora i niczym więcej. Może ją zignorować lub w rzeczywistości wstawiać funkcje nieoznaczone jako wbudowane.Używanie
inline
z szablonami było kiedyś (słabym) sposobem obejścia problemu, że każda jednostka kompilacji tworzyłaby oddzielny obiekt dla tej samej klasy z szablonami, co powodowałoby problemy z powielaniem w czasie łączenia. Używającinline
(myślę), że zniekształcenie nazwy działa inaczej, co powoduje konflikt nazw w czasie łącza, ale kosztem ogromnie rozdętego kodu.Marshall Cline wyjaśnia to lepiej niż ja.
źródło
§14.5.5.1 p7 & p8
). Moja wina, usunąłem zły komentarz.