variable initialize c++ static

c++ - initialize - ¿por qué "no se puede usar ''estático'' cuando se define(en lugar de declarar) un miembro de datos estáticos"?



static variable c (3)

Declarar un miembro de clase static significa que se comparte entre todos los objetos de esta clase.

Cuando agrega static a una definición de variable fuera de una clase, significa que esta variable tiene alcance de archivo y no es visible fuera de este.

Si se le permitiera

const static map<int,int> A:: myMap = A::create_map();

esto significaría que tiene una variable miembro estática, que no es visible fuera de este archivo. Esto simplemente no tiene sentido.

Estaba buscando formas de inicializar el mapa estático en C ++ y encontré este código:

struct A{ static map<int,int> create_map() { map<int,int> m; m[1] = 2; m[3] = 4; m[5] = 6; return m; } static const map<int,int> myMap; }; const map<int,int> A:: myMap = A::create_map();

Sin embargo, si cambio la última línea a

const static map<int,int> A:: myMap = A::create_map();

Quejas del compilador: ''estática'' no se puede usar cuando se define (en lugar de declarar) un miembro de datos estáticos "?

¿Me pregunto porque? ¿Cuál es la lógica o el razonamiento detrás de esto?


No es diferente de

struct A { static int x; } int A::x; //legal static int A::x; //illegal

Todo lo demás son solo más palabras clave lanzadas en este ejemplo mínimo, conceptualmente idéntico. Un miembro static solo se puede declarar static dentro de la definición de clase.

los

const map<int,int> A:: myMap = A::create_map();

fuera de la clase es solo una definición del miembro static A::myMap . La static extra no tiene sentido allí.

El razonamiento detrás de esto es, probablemente, para evitar confusiones: una variable static libre es una clase de variable "privada" (a una unidad de traducción). Un miembro static es lo contrario.


static int a = 0; // grandfathered and still useful, provides static *LINKAGE* // and static STORAGE DURATION static int X::a = 0; // confusing and illegal, is it static LINKAGE // or static STORAGE DURATION // or static MEMBERSHIP?

static ya tenía un significado (en C) cuando se usaba en una definición de variable. Sería muy sorprendente para los programadores de C que aprenden C ++ descubrir que el significado ha cambiado algunas veces, pero no siempre.

Por lo tanto, el nuevo significado (membresía estática) solo está activo dentro de la definición de la clase (donde C no permitió la palabra clave static ).