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 staticun enlace como un especificador de clase de almacenamiento (es decir, dentro y fuera de una función).

statices 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 losstaticobjetos.Respuestas:
En el alcance del archivo, no hay diferencia en C ++.
consthace 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
constpuede calcular un valor de instancia en la lista de inicializadores de ctor . Astatic constse establece durante la inicialización de inicio y permanece sin cambios para el resto del programa. (Nota: el código para losstaticmiembros se ve un poco diferente porque la declaración y la inicialización están separadas).Recuerde, en C ++,
constsignifica solo lectura , no constante . Si tiene un puntero a,constentonces 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
constaplica a una vista de la variable y no a la variable en sí, otra persona puede tener una noconstvista de la misma variable y el compilador se mantendrá en silencio cuando la modifique.const, pero lo nuevoconstexprse puede usar en su lugar (y también en otros escenarios). En realidad, el estándar C ++ 0x amplía la capacidad de usoconsten ese escenario a "tipos literales" no integrales también. Creo que preferiría usarconstexprpara 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
constimplicastaticen 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 ++?
externen encabezado, definición en archivo cppfuente