El código de costumbre en realidad el trabajo en VC++ - no se está actualizando el valor (o al menos que no deberia), de ahí la advertencia de GCC. código correcto es
const_cast<myType*&>(myMember) = new myType();
o [de otra respuesta, gracias: P]:
const_cast<ThisType*>(this)->myMember = new myType();
Por lo que es mutable efectivamente significa que usted obtiene implícitas const_cast
s en const
funciones miembro, que generalmente es lo que debe ser dirigiéndose hacia cuando te encuentras haciendo un montón de const_cast
s en this
. No hay 'efectos colaterales al uso de' mutable 'que no sea eso.
Como puede ver en los vehemente debates que rodean esta pregunta, el uso indebido de mutable
y muchos const_cast
s definitivamente pueden ser síntomas de malos olores en su código. Desde un punto de vista conceptual, la eliminación de la constness o el uso de mutable
puede tener implicaciones mucho más grandes. En algunos casos, lo correcto puede ser cambiar el método a no const, es decir, admitir el hecho de que está modificando el estado.
Todo depende de la cantidad de const-corrección cuestiones en su contexto - usted no quiere terminar simplemente sprinking mutable
alrededor como polvo mágico para hacer funcionar las cosas, pero mutable
está destinado para el uso si la pieza miembro de isnt de lo observable estado del objeto. La visión más rigurosa de la corrección de constión sostendría que no se puede modificar ni un solo bit del estado del objeto (p. Ej., Esto podría ser crítico si su instancia está en ROM ...) - en esos casos no quiere ninguna constness estar perdido. En otros casos, puede tener algún estado externo almacenado en algún lugar fuera del objeto; por ejemplo, un caché específico de subprocesos que también debe tenerse en cuenta al decidir si es apropiado.
Gracias. [min 15 caracteres] –
Creo que mientras esto funciona es posiblemente la peor solución. Oculta completamente lo que ocurre (cambiando un estado interno de una instancia inmutable) en un molde de fusión en la función miembro. "mutable" sería más claro (o usando interfaces). –
fundir constness conduce a un comportamiento indefinido. Úselo bajo su propio riesgo. Una mejor solución sería hacer que el método no const. –