¿Cuál es la forma correcta de inicializar miembros de datos estáticos en C++ (98, 11 y 14)


¿Cuál es la forma correcta de inicializar static miembros de datos 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 static miembros de datos?

Author: Columbo, 2014-10-30

1 answers

Las reglas siempre han sido las siguientes:

  • Un const miembro de datos estáticos (SDM) de tipo integral o enumeración puede inicializarse en clase con una expresión constante.

  • A constexpr SDM 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, constexpr los SDM son implícitamente variables en línea, lo que hace que su declaración sea una definición (externa las definiciones están obsoletas).

  • Otros tipos de SDM pueden tener un inicializador en su definición (que está en clase si ese SDM se declara inline).

Nada ha cambiado sustancialmente entre C++03 y C++11+ para el código que es válido en ambos lenguajes.

Tenga en cuenta que para los SDM que no están en línea, la declaración in-class no es una definición, independientemente de si se proporciona un inicializador, y deben definirse si se utilizan 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;
};
 30
Author: Columbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-20 12:15:48