La mutableparola chiave è un modo per perforare il constvelo 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 constriferimento 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' mutableeccezione lo rende così ora puoi scrivere o impostare membri di dati che sono contrassegnati mutable. Questa è l'unica differenza visibile esternamente.
Internamente quei constmetodi 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 mutablenon distrugga il constconcetto e venga utilizzato solo in casi speciali utili. La mutableparola chiave aiuta perché indica chiaramente i membri dei dati che sono soggetti a questi casi speciali.
In pratica puoi usare constossessivamente tutto il tuo codebase (essenzialmente vuoi "infettare" il tuo codebase con la const"malattia"). In questo mondo, puntatori e riferimenti hanno constpochissime eccezioni, producendo codice che è più facile ragionare e comprendere. Per una digressione interessante cercare "trasparenza referenziale".
Senza la mutableparola chiave alla fine sarai costretto a utilizzare const_castper 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 mutableperché costringe il client API a distruggere la constprotezione degli oggetti che sta usando. Inoltre provoca una constdistruzione diffusa : const_castl'inging un puntatore const o riferimento consente la scrittura senza restrizioni e il metodo che chiama l'accesso ai membri visibili. Al contrario, mutableil progettista dell'API deve esercitare un controllo accurato sulle consteccezioni, e di solito queste eccezioni sono nascoste nei constmetodi 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 .)