Влияние встроенного ключевого слова на функции шаблона члена класса? - PullRequest
1 голос
/ 08 ноября 2019

Я читал о встраивании спецификаций шаблонных функций здесь

Кроме того, что требуется inline ключевое слово для создания экземпляра в заголовке, что логично, я не могу найти ответ, является ли этоЕсть ли какая-либо разница в том, чтобы помечать шаблоны не специализированных функций как inline в заголовке? будь то функции-члены или просто обычные функции.

Пожалуйста, не объясните, почему компилятор знает лучше, чем программист, вопрос в следующем: имеет ли ключевое слово inline какое-то значение для "распакованных" шаблонов в заголовке?

всегда ли встроенные неспецифические шаблоны, так как они находятся в заголовке? для приведенного ниже примера псевдокод, если мы предположим, что метод Foo::bar может быть очень длинным или очень коротким, влияет ли пропуск ключевого слова inline или добавление ключевого слова inline на фактическую вероятность встраивания или не встраивания расширенной функции компилятором?

Вот пример для шаблонов функций-членов, который отражает мой код:

class Foo
{
public:
    template<typename Type>
    static Type bar();
};

Пример не встроенного определения:

template<typename Type>
Type Foo::bar()
{
    return Type();
}

Пример встроенного определения:

template<typename Type>
inline Type Foo::bar()
{
    return Type();
}

Это ключевое слово inline выше всегда бесполезно, или оно имеет смысл, только если функция может быть встроена компилятором? шаблоны всегда встроены в заголовок?

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

Ключевое слово inline используется для обхода правила One Definition , а не для указания внутренней замены вызова функции. Обратите внимание, что компилятору все еще нужно определение функции для выполнения подстановки, поэтому вам нужно будет указать inline, если определение функции находится в заголовочном файле, который включен в разные файлы.

Специализированная функцияшаблон похож на обычную функцию, потому что все параметры шаблона были исправлены (то есть шаблоны функций не могут быть частично специализированными). Поэтому, если (полностью) шаблон специализированной функции находится в заголовочном файле, вы должны сделать так, чтобы inline обрабатывал правило единого определения точно так же, как вы должны делать это с обычной функцией.

1 голос
/ 08 ноября 2019

Я думаю, что нашел что-то об этом, и похоже, что inline действительно имеет значение для определения шаблона в заголовке, IE. если вы опустите inline, то эта функция не будет встроенной!

Ссылочная ссылка

Цитата:

В качестве примера рассмотрим файл заголовка Foo.h, который содержит следующий класс шаблона. Обратите внимание, что метод Foo :: f () является встроенным, а методы Foo :: g () и Foo :: h () - нет.

// File "Foo.h"
template<typename T>
class Foo {
public:
  void f();
  void g();
  void h();
};
template<typename T>
inline
void Foo<T>::f()
{
  // ...
}

Похоже, мыМожно с уверенностью заключить, что шаблоны не являются неявно встроенными, но пример подразумевает, что другие 2 метода определены в файле cpp, поэтому все ставки на выводы отключены. все еще ищу стандартное подтверждение.

...