En C ++, para declarar un objeto de una clase que tiene una variable miembro como const
, debemos tener un constructor predeterminado definido por el usuario. El siguiente código ilustra esto.
class Some {
int value;
};
int main() {
// error: default initialization of an object of const type 'const Some'
// without a user-provided default constructor
const Some some;
return 0;
}
Sin embargo, si una variable miembro propiedad de una clase se califica como mutable, el compilador no informará ningún error. Como referencia, compilé usando el comando clang++ -std=c++17 -stdlib=libc++ helloworld.cpp -o helloworld.out --debug
. Me pregunto si este resultado se debe a un error en el compilador o de acuerdo con la sintaxis definida en el lenguaje C ++.
class Some {
mutable int value;
};
int main() {
const Some some;
return 0;
}
mutable
es un poco lo contrario deconst
. ¿Por qué esperabas el mismo efecto?const
, lo que significa que no se puede cambiar y que tiene valores no inicializados, no hay uso para este tipo de código y es por eso que está prohibido. Cuando usa lamutable
palabra clave, significa que el valor se puede cambiar más tarde, por lo que el código se puede usar de manera predecible.Respuestas:
Reescribiendo mi comentario como respuesta, espero que pueda ayudar a alguien.
No tiene sentido declarar un objeto constante si no se inicializa de alguna forma.
Considere el siguiente código:
tañido dice:
error: default initialization of an object of const type 'const int'
.gcc diría:
error: uninitialized const ‘x’ [-fpermissive]
La lógica detrás de esto es que no tiene sentido este tipo de declaración.
El valor de
x
nunca puede cambiar y, por lo tanto, este código sería impredecible, yax
que se asignaría a la memoria no inicializada.En su ejemplo, la adición de la palabra clave
mutable
quevalue
significa que aunque elSome
ejemplo es constante cuando se declara como:Todavía es posible cambiar
value
en un momento posterior.Por ejemplo:
Esto significa que es posible usar este código de manera predecible, ya que
value
se puede configurar más tarde y no hay constantes no inicializadas.fuente