Semántica de C ++ de `static const` vs` const`

En C ++ específicamente, ¿cuáles son las diferencias semánticas entre, por ejemplo:

static const int x = 0 ; 

y

 const int x = 0 ; 

para ambos static como un enlace y un especificador de clase de almacenamiento (es decir, dentro y fuera de una función).

En el scope 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 usarla.

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 comstackción como requieren otros lenguajes.

Dentro de una clase, básicamente lo mismo que para las funciones, un valor de instancia de instancia se puede calcular en la lista inicializador de ctores . Un static const se establece durante la inicialización de inicio y permanece sin cambios para el rest del progtwig. (Nota: el código para miembros static se ve un poco diferente porque la statement 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 progtwig pueden cambiar el valor mientras no está buscando. Si la variable se definió con const , entonces nadie puede cambiarla después de la inicialización, pero la inicialización aún puede ser arbitrariamente compleja.