Определение inline функции вне класса
Является ли функция, определённая вне класса, используя спецификатор inline, inline? Можно ли в объявлении не использовать inline, а в определении - использовать?
struct S {
void foo();
};
inline void S::foo() {}
Не могу понять из документации. Там написано про определение внутри класса и то, что нельзя переобъявлять функцию как inline, если до этого она была определена как не inline.
Ответы (2 шт):
Если определение функции_члена выполняется в той же области видимости, что и объявление класса, то она автоматически легко встраивается. Так что:
{
struct S {
void foo();
};
inline void S::foo() {}
}
или
{
struct S {
void foo();
};
void S::foo() {}
}
или
{
struct S {
void foo(){}
};
}
ничем не отличаются.
Метод может быть inline в 5 случаях:
- Объявлен c
inline, затем определен безinline:
struct S
{
inline void foo();
};
void S::foo() {}
- Объявлен c
inline, затем определен cinline:
struct S
{
inline void foo();
};
inline void S::foo() {}
- Объявлен без
inline, затем определен cinline:
struct S
{
void foo();
};
inline void S::foo() {}
- Объявлен c
inlineи сразу определен в теле класса:
struct S
{
inline void foo() {}
};
- Объявлен без
inlineи сразу определен в теле класса, который не экспортируется:
struct S
{
void foo() {}
};
Если класс экспортируется из модуля, то метод уже не будет inline, это стоит иметь ввиду при переводе существующего кода на модули:
export module test;
export struct S
{
void foo() {}
};
ЗЫ еще есть шаблоны, но это другая история