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