Le mutable
mot-clé est un moyen de percer le const
voile que vous drapez sur vos objets. Si vous avez une référence const ou un pointeur vers un objet, vous ne pouvez en aucun cas modifier cet objet sauf quand et comment il est marqué mutable
.
Avec votre const
référence ou votre pointeur, vous êtes contraint de:
- accès en lecture uniquement aux membres de données visibles
- autorisation d'appeler uniquement les méthodes marquées comme
const
.
Grâce à l' mutable
exception, vous pouvez désormais écrire ou définir des membres de données marqués mutable
. C'est la seule différence visible de l'extérieur.
En interne, les const
méthodes visibles par vous peuvent également écrire sur les membres de données marqués mutable
. Essentiellement, le voile const est percé de manière complète. Il appartient entièrement au concepteur d'API de s'assurer que mutable
cela ne détruit pas le const
concept et n'est utilisé que dans des cas spéciaux utiles. Le mutable
mot-clé est utile car il marque clairement les membres de données qui sont soumis à ces cas particuliers.
En pratique, vous pouvez utiliser de manière const
obsessionnelle tout au long de votre base de code (vous voulez essentiellement "infecter" votre base de code avec leconst
"maladie"). Dans ce monde, les pointeurs et les références sont const
à de très rares exceptions près, produisant un code plus facile à raisonner et à comprendre. Pour une digression intéressante, recherchez "transparence référentielle".
Sans le mutable
mot - clé, vous serez éventuellement contraint d'utiliser const_cast
pour gérer les différents cas spéciaux utiles qu'il permet (mise en cache, comptage de références, données de débogage, etc.). Malheureusement, il const_cast
est beaucoup plus destructeur que mutable
parce qu'il oblige le client API à détruire la const
protection des objets qu'il utilise. De plus, il provoque une const
destruction généralisée : const_cast
un pointeur ou une référence const permet une écriture et une méthode d'appel sans entrave donnant accès aux membres visibles. En revanche, mutable
le concepteur d'API doit exercer un contrôle fin sur les const
exceptions, et généralement ces exceptions sont masquées dansconst
méthodes fonctionnant sur des données privées.
(NB je me réfère à la visibilité des données et des méthodes à quelques reprises. Je parle des membres marqués comme public vs privé ou protégé qui est un type totalement différent de protection d'objet discuté ici .)