Определение inline функции вне класса

Является ли функция, определённая вне класса, используя спецификатор inline, inline? Можно ли в объявлении не использовать inline, а в определении - использовать?

struct S {
    void foo();
};

inline void S::foo() {}

Не могу понять из документации. Там написано про определение внутри класса и то, что нельзя переобъявлять функцию как inline, если до этого она была определена как не inline.


Ответы (2 шт):

Автор решения: AR Hovsepyan

Если определение функции_члена выполняется в той же области видимости, что и объявление класса, то она автоматически легко встраивается. Так что:

{
    struct S {
        void foo();
    };
    inline void S::foo() {}
}

или

{
    struct S {
        void foo();
    };
    void S::foo() {}
}

или

{
    struct S {
        void foo(){}
    };        
}

ничем не отличаются.

→ Ссылка
Автор решения: user7860670

Метод может быть inline в 5 случаях:

  1. Объявлен c inline, затем определен без inline:
struct S
{
    inline void foo();
};

void S::foo() {}
  1. Объявлен c inline, затем определен c inline:
struct S
{
    inline void foo();
};

inline void S::foo() {}
  1. Объявлен без inline, затем определен c inline:
struct S
{
    void foo();
};

inline void S::foo() {}
  1. Объявлен c inline и сразу определен в теле класса:
struct S
{
    inline void foo() {}
};
  1. Объявлен без inline и сразу определен в теле класса, который не экспортируется:
struct S
{
    void foo() {}
};

Если класс экспортируется из модуля, то метод уже не будет inline, это стоит иметь ввиду при переводе существующего кода на модули:

export module test;

export struct S
{
    void foo() {}
};

ЗЫ еще есть шаблоны, но это другая история

→ Ссылка