Le code ne fonctionnera pas réellement dans VC++ - vous n'êtes pas mise à jour de la valeur (ou du moins il ne devrait pas), d'où l'avertissement du CCG. code correct est
const_cast<myType*&>(myMember) = new myType();
ou [d'autres réponses, merci: P]:
const_cast<ThisType*>(this)->myMember = new myType();
Rendre mutable signifie effectivement que vous obtenez const_cast
implicites s dans const
fonctions membres, ce qui est généralement ce que vous devriez direction vers quand vous vous trouvez en train de faire des charges de const_cast
s sur this
. Il n'y a pas «d'effets secondaires à l'utilisation de mutable» autre que cela.
Comme vous pouvez le voir à partir des débats véhéments autour de cette question, l'utilisation de mutable
et de beaucoup de s peuvent certainement être des symptômes de mauvaises odeurs dans votre code. D'un point de vue conceptuel, le rejet de constness ou l'utilisation de mutable
peut avoir des implications beaucoup plus importantes. Dans certains cas, la bonne chose à faire peut être de changer la méthode en non-const, c'est-à-dire d'assumer le fait qu'elle modifie l'état.
Tout dépend de la façon dont les questions beaucoup const-exactitude dans votre contexte - vous ne voulez pas finir juste sprinking mutable
autour comme la poussière de Pixie pour faire le travail de choses, mais mutable
est destiné à un usage si la partie ISNT membre de l'observable état de l'objet. La vue la plus stricte de const-correct serait que pas un seul bit de l'état de l'objet ne peut être modifié (par exemple, cela peut être critique si vous êtes instance est en ROM ...) - dans ces cas, vous ne voulez pas de constness être perdu. Dans d'autres cas, vous pouvez avoir un état externe stocké quelque part à l'extérieur de l'objet - par exemple, un cache spécifique au thread qui doit également être pris en compte pour décider s'il est approprié.
Merci. [min 15 caractères] –
Je pense que pendant que cela fonctionne c'est peut-être la pire solution. Il masque complètement ce qui se passe (en changeant un état interne d'une instance immutable) dans un const-cast dans la fonction membre. "mutable" serait plus clair (ou utilisant des interfaces). –
L'élimination de la constellation conduit à un comportement indéfini. À utiliser à vos risques et périls. Une meilleure solution serait de rendre la méthode non const. –