Я получаю ошибку в режиме отладки и выпуска (/ Ox) с использованием компилятора MS C ++ версии 19.16 (поставляется, например, с Visual Studio 15.9.4).
Inline.Hpp
#include <iostream>
inline struct Foo
{ Foo() { std::cout << "Constructing a Foo at " << this << std::endl; } }
Instance;
Inline.cpp
#include "Inline.Hpp"
int main() { return 0; }
Inline2.cpp
#include "Inline.Hpp"
После компиляции и компоновки inline.cpp и inline2.cpp вывод при запуске:
Constructing a Foo at 00BE4028
Constructing a Foo at 00BE4028
Компилятор и компоновщик правильно разрешают два встроенных определения в один объект, но некорректно вызывают конструктор для каждого определения, а не один раз. Это серьезная ошибка, которая делает функцию «встроенной переменной» C ++ 17 непригодной для использования. «Обходной путь» - рассматривать встроенные переменные как все еще не поддерживаемые MS C ++ начиная с версии 19.16, даже когда используется ключ / std: c ++ 17.