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).