varios variable una turbo tipos reservadas palabras guardar funcion datos c++ templates inline c++17

una - ¿Las variables estáticas están en línea dentro de las plantillas en C++ 17?



tipos de variables turbo c (2)

¿Las variables estáticas están en línea dentro de las plantillas en C ++ 17? Aquí hay un ejemplo:

template<typename T> struct SomeClass { static T test; }; struct SomeClass2 { static constexpr int test = 9; };

¿Están esas variables en línea o todavía se necesita una definición fuera de línea para ser ODR?


Desde [dcl.constexpr]:

Una función o un miembro de datos estáticos declarado con el especificador constexpr es implícitamente una función o variable en línea (7.1.6).

No hay tal inline implícita para los miembros de datos estáticos (no constexpr ) de las plantillas de clase. Sin embargo, en C ++ 17, ahora podemos marcar las variables como inline , [dcl.inline]:

Una declaración de variable con un especificador en inline declara una variable en línea.


Un static constexpr estará implícitamente en inline , de lo contrario tendrá que marcarlo como en inline

template<typename T> struct SomeClass { inline static T test; // Now inline }; struct SomeClass2 { static constexpr int test = 9; // inline };

Cfr. desde n4606 [depr.static_constexpr]

Para compatibilidad con los estándares internacionales anteriores de C ++, un miembro de datos estáticos constexpr puede ser redeclarado de manera redundante fuera de la clase sin inicializador. Este uso está en desuso.

Ejemplo:

struct A { static constexpr int n = 5; // definition (declaration in C++ 2014) }; const int A::n; // redundant declaration (definition in C++ 2014)

y [dcl.constexpr] (Barry me dio una paliza)

Una función o un miembro de datos estáticos declarado con el especificador constexpr es implícitamente una función o variable en línea (7.1.6).