Поскольку шаблоны определены в заголовках, и компилятор может определить, выгодно ли встраивание функции, имеет ли это смысл? Я слышал, что современные компиляторы лучше знают, когда встраивать функцию, и игнорируют inline
подсказки.
изменить: я хотел бы принять оба ответа, но это невозможно. Чтобы закрыть вопрос, я принимаю ответ Френеля , потому что он получил большинство голосов, и он формально прав, но, как я уже упоминал в комментариях, я считаю ответы Puppy и Компонента 10 правильными, с разных точек зрения. ,
Проблема в семантике C ++, которая не является строгой в случае inline
ключевого слова и встраивания. Френель говорит: «пишите в строке, если вы это имеете в виду», но что на самом деле имеется в виду, inline
неясно, поскольку оно эволюционировало от своего первоначального значения до директивы, которая, как говорит Puppy, « не дает компиляторам скучать по поводу нарушений ODR» .
inline
только потому, что специализированный шаблон отмечен значкомinline
. Так чтоinline
о шаблоне совершенно неактуально. Должна быть эта функцияinline
или нет, не имеет ничего общего с тем, что она генерируется с помощью специализации шаблона (и есть лучшие ответы, чем этот адрес, когда использоватьinline
). Ответ @Puppy ниже правильный, а этот - нет. Добавлениеinline
шаблона не имеет значения иclang-tidy
фактически удалит его.inline
не иметь никакого значения, пример должен охватывать случай явно специализирующийсяtemplate<> void f<>(int) {}
без наinline
ключевое слово. Но даже тогда изменениеinline
спецификатора в шаблоне не имеет никакого значения, потому что отметьте вы шаблонinline
или нет, не имеет значения.Это не имеет значения. Все шаблоны уже есть,
inline
не говоря уже о том, что с 2012 годаinline
ключевое слово используется только для того, чтобы компиляторы не жаловались на нарушения ODR. Вы абсолютно правы - ваш компилятор текущего поколения будет знать, что вставлять самостоятельно, и, вероятно, сможет это сделать даже между единицами перевода.источник
inline
функции с метками (то есть несколько эквивалентных определений могут быть переданы компоновщику, который выберет одно). Это реальная функцияinline
ключевого слова , а не встраивание .inline
. Может быть, взгляните на мой ответ ниже (или выше, в зависимости от выбранной сортировки). Для неспециализированных шаблонов вы, конечно, правы, но формально это не то.inline
то, что должно быть встроенным. Обычно это не имеет значения, но в стандартном языке они не совпадают, и не все они встроены. Я принимаю вашу позицию по этому поводу: «Это неактуально», но по стандарту не все шаблоны встроены, только для вас, как пользователя C ++, они выглядят так, как будто.Как вы предположили,
inline
это подсказка компилятору и не более того. Он может игнорировать это или, действительно, встроить функции, не отмеченные встроенными.Использование
inline
с шаблонами раньше было (плохим) способом решения проблемы, заключающейся в том, что каждая единица компиляции создавала отдельный объект для одного и того же шаблонного класса, что затем приводило к проблемам с дублированием во время связывания. При использованииinline
(я думаю) искажение имен работает по-другому, что позволяет избежать конфликта имен во время ссылки, но за счет сильно раздутого кода.Маршалл Клайн объясняет это здесь лучше, чем я.
источник
§14.5.5.1 p7 & p8
). Моя беда, я удалил не тот комментарий.