Компиляторы довольно вольно обращаются со спецификатором
inline. Например, они не обязаны встраивать код функции в месте ее вызова несмотря на то, что вы объявили функцию со спецификатором
inline. С другой стороны, компилятор сам без вашего ведома может встроить код функции в месте ее вызова, хотя вы не объявляли функцию со спецификатором
inline.
Наверное, именно с этим связано наличие багов в известных компиляторах, имеющих отношение к спецификатору
inline.
Например, согласно стандарту C++ 20 (9.1.6 The inline specifier [dcl.inline])
цитата: |
6. ... If a definition of a function or variable is reachable at the point of its first declaration as inline, the program is ill-formed. |
|
Теперь рассмотрим следующую простую программу.
#include <iostream>
void f()
{
std::cout << "Hello inline specifier!\n";
}
inline void f();
int main()
{
f();
return 0;
}
Компиляторы
gcc HEAD 10.0.1 20200 и
Visual C++ 2019 успешно компилируют программу, и программа выводит на консоль сообщение
Hello inline specifier!
И лишь компилятор
clang HEAD 11.0.0 выдает сообщение об ошибки во время компиляции
prog.cc:8:13: error: inline declaration of 'f' follows non-inline definition
inline void f();
^
prog.cc:3:6: note: previous definition is here
void f()
^
1 error generated.
Теперь обратимся к другому параграфу данной секции стандарта
C++.
цитата: |
5. ... If the inline specifier is used in a friend function declaration, that declaration shall be a definition or the function shall have previously been declared inline. |
|
Попробуем скомпилировать следующую программу перечисленными компиляторами.
#include <iostream>
void h();
class A
{
inline friend void h();
};
void h()
{
std::cout << "Hello inline specifier of ftiend!\n";
}
int main()
{
h();
return 0;
}
И ... программа успешно компилируется всеми тремя компиляторами!

Вывод программы на консоль
Hello inline specifier of ftiend!