La mutable
parola chiave è un modo per perforare il const
velo che drappeggi sui tuoi oggetti. Se hai un riferimento const o un puntatore a un oggetto, non puoi modificarlo in alcun modo tranne quando e come è contrassegnato mutable
.
Con il tuo const
riferimento o puntatore sei costretto a:
- accesso in sola lettura per tutti i membri di dati visibili
- permesso di chiamare solo i metodi contrassegnati come
const
.
L' mutable
eccezione lo rende così ora puoi scrivere o impostare membri di dati che sono contrassegnati mutable
. Questa è l'unica differenza visibile esternamente.
Internamente quei const
metodi che sono visibili a te possono anche scrivere ai membri di dati che sono contrassegnati mutable
. In sostanza, il velo const viene perforato in modo completo. Spetta completamente al progettista API assicurarsi che mutable
non distrugga il const
concetto e venga utilizzato solo in casi speciali utili. La mutable
parola chiave aiuta perché indica chiaramente i membri dei dati che sono soggetti a questi casi speciali.
In pratica puoi usare const
ossessivamente tutto il tuo codebase (essenzialmente vuoi "infettare" il tuo codebase con la const
"malattia"). In questo mondo, puntatori e riferimenti hanno const
pochissime eccezioni, producendo codice che è più facile ragionare e comprendere. Per una digressione interessante cercare "trasparenza referenziale".
Senza la mutable
parola chiave alla fine sarai costretto a utilizzare const_cast
per gestire i vari casi speciali utili che consente (memorizzazione nella cache, conteggio dei riferimenti, dati di debug, ecc.). Sfortunatamente const_cast
è significativamente più distruttivo che mutable
perché costringe il client API a distruggere la const
protezione degli oggetti che sta usando. Inoltre provoca una const
distruzione diffusa : const_cast
l'inging un puntatore const o riferimento consente la scrittura senza restrizioni e il metodo che chiama l'accesso ai membri visibili. Al contrario, mutable
il progettista dell'API deve esercitare un controllo accurato sulle const
eccezioni, e di solito queste eccezioni sono nascoste nei const
metodi che operano su dati privati.
(NB Mi riferisco alla visibilità dei dati e del metodo alcune volte. Sto parlando di membri contrassegnati come pubblici o privati o protetti, che è un tipo completamente diverso di protezione degli oggetti discussi qui .)