En C ++ específicamente, ¿cuáles son las diferencias semánticas entre, por ejemplo:
static const int x = 0 ;
y
const int x = 0 ;
tanto para static
un enlace como un especificador de clase de almacenamiento (es decir, dentro y fuera de una función).
static
es probablemente la palabra clave más sobrecargada en C ++. El significado de su código varía ampliamente dependiendo de si está en el alcance del espacio de nombres, en el alcance de la clase o en el alcance de la función. Es posible que desee aclarar eso.::
sin identificador en el frente). No conozco ninguna diferencia significativa entre el espacio de nombres global y cualquier espacio de nombres anidado en él. Ciertamente no hay ninguno con respecto a losstatic
objetos.Respuestas:
En el alcance del archivo, no hay diferencia en C ++.
const
hace que el enlace interno sea el predeterminado, y todas las variables globales tienen una vida útil estática. Pero la primera variante tiene el mismo comportamiento en C, por lo que puede ser una buena razón para usarlo.Dentro de una función, la segunda versión se puede calcular a partir de parámetros. En C o C ++ no tiene que ser una constante de tiempo de compilación como requieren otros lenguajes.
Dentro de una clase, básicamente lo mismo que para las funciones. Se
const
puede calcular un valor de instancia en la lista de inicializadores de ctor . Astatic const
se establece durante la inicialización de inicio y permanece sin cambios para el resto del programa. (Nota: el código para losstatic
miembros se ve un poco diferente porque la declaración y la inicialización están separadas).Recuerde, en C ++,
const
significa solo lectura , no constante . Si tiene un puntero a,const
entonces otras partes del programa pueden cambiar el valor mientras no está buscando. Si la variable se definió conconst
, entonces nadie puede cambiarla después de la inicialización, pero la inicialización puede ser arbitrariamente compleja.fuente
const
aplica a una vista de la variable y no a la variable en sí, otra persona puede tener una noconst
vista de la misma variable y el compilador se mantendrá en silencio cuando la modifique.const
, pero lo nuevoconstexpr
se puede usar en su lugar (y también en otros escenarios). En realidad, el estándar C ++ 0x amplía la capacidad de usoconst
en ese escenario a "tipos literales" no integrales también. Creo que preferiría usarconstexpr
para esos casos, ya que de todos modos estarías rompiendo la compatibilidad con compiladores anteriores a C ++ 0x.El borrador estándar de C ++ 17
const
implicastatic
en el alcance del archivoEsta es la cita de lo que se mencionó en: https://stackoverflow.com/a/3709257/895245
C ++ 17 n4659 borrador estándar 6.5 "Programa y vinculación":
Anexo C (informativo) Compatibilidad, C.1.2 Cláusula 6: "conceptos básicos" da la razón por la cual esto cambió de C:
Ver también: ¿Por qué const implica vinculación interna en C ++, cuando no lo hace en C?
Lo que probablemente quieras hacer en los encabezados
Explicado en detalle en: ¿Qué significa 'const static' en C y C ++?
extern
en encabezado, definición en archivo cppfuente