initialize - ¿Cuál es la forma correcta de inicializar miembros de datos estáticos en C++(98, 11 y 14)?
constexpr (1)
¿Cuál es la forma correcta de inicializar miembros de datos static
en C ++? También estoy interesado en cómo ha cambiado de C ++ 98 a C ++ 11 a C ++ 14.
Aquí hay un ejemplo:
// bufferedOutput.h
class BufferedOutput
{
// Static member declaration.
static long bytecount;
};
// bufferedOutput.cpp
long BufferedOutput::bytecount = 50;
¿Hay otras formas de inicializar miembros de datos static
?
Las reglas siempre han sido las siguientes:
Un miembro de datos estáticos
const
(SDM) de tipo integral o de enumeración se puede inicializar en clase con una expresión constante.Un SDM
constexpr
debe inicializarse en clase con una expresión constante.C ++ 17 ya no requiere un inicializador cuando el constructor predeterminado inicializa cada miembro. Además, los
constexpr
constexpr son variables implícitamente en línea, lo que hace que su declaración sea una definición (las definiciones externas ahora están en desuso).- Otros tipos de SDM pueden tener un inicializador en su definición (que está en clase si ese SDM se declara en
inline
).
Nada ha cambiado sustancialmente entre C ++ 03 y C ++ 11 + para el código que es válido en ambos idiomas.
Tenga en cuenta que para los SDM que no están en línea, la declaración dentro de la clase no es una definición, independientemente de si se proporciona un inicializador, y deben definirse si se usan odr.
A partir de C ++ 17, podemos hacer su SDM en línea, lo que hace que su declaración en clase sea una definición:
class BufferedOutput
{
static inline long bytecount = 50;
};