initialize c++ c++11 static-members c++14 c++98

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; };