Clang/LLVM 7 y 8 en Windows inicializan el miembro de datos estáticos en línea varias veces (con link.exe y lld-link.exe)

 C Programming >> Programación C >  >> Tags >> Clang
Clang/LLVM 7 y 8 en Windows inicializan el miembro de datos estáticos en línea varias veces (con link.exe y lld-link.exe)

La característica principal del inline palabra clave es que modifica la regla ODR de dos maneras:

  1. Se permiten múltiples definiciones (con algunas restricciones)

  2. Los objetos resultantes se "pliegan" en una sola instancia:

La única adición en C++17 es que también permite un static declaración de miembro de datos para ser una definición. Eso es todo.

Un static el miembro de datos todavía tiene el mismo vínculo (externo en su caso), la duración del almacenamiento y la vida útil, y para todos los propósitos prácticos funciona como una variable definida globalmente. Consulte [class.static.data]/6:

Eso significa esencialmente que debería funcionar igual que esto:

struct A
{
  A()      { std::cout << "ctor "; }
  ~A()     { std::cout << "dtor "; }
};

A a; // in one of the TU's

extern A a; // in all other TU's

Conclusión:

Es un error en Clang. El static S::a debe inicializarse y destruirse una vez.