mutableКлючове слово є способом проколоти constзавісу ви задрапірувати над вашими об'єктами. Якщо у вас є посилання const або вказівник на об'єкт, ви не можете його змінювати жодним чином, крім випадків, коли і як він позначений mutable.
За допомогою constпосилання або вказівника ви обмежуєтесь:
- доступ для читання лише для будь-яких видимих членів даних
- дозвіл на виклик лише методів, позначених як
const.
mutableВиняток робить це так , ви можете написати або набір елементів даних, відзначені mutable. Це єдина зовні зовнішня різниця.
Внутрішньо ті види, constякі ви бачите, також можете записати членам даних, які позначені mutable. По суті, завіса прокляття пронизана всебічно. Це повністю залежить від дизайнера API, щоб переконатись, що mutableце не руйнує constконцепцію та використовується лише в корисних спеціальних випадках. mutableКлючове слово допомагає , тому що це ясно елементи марки даних, які підпадають під дію цих особливих випадків.
На практиці ви можете constнав’язливо використовувати всю свою кодову базу (ви, власне, хочете "заразити" свою кодову базу const"хворобою"). У цьому світі покажчики та посилання є constза дуже невеликими винятками, приводячи код, який простіше обґрунтувати та зрозуміти. Для цікавого відступу шукайте "референтну прозорість".
Без mutableключового слова ви зрештою будете змушені використовувати const_castдля обробки різних корисних спеціальних випадків, які це дозволяє (кешування, підрахунок посилань, налагодження даних тощо). На жаль, const_castвін значно руйнівніший, ніж mutableтому, що він змушує клієнта API знищити constзахист об'єктів, які він використовує. Крім того, це спричиняє широке constруйнування: const_castвикористання вказівника const або посилання дозволяє безперешкодно записувати та метод виклику доступу до видимих членів. На відміну від цього mutableвимагає, щоб розробник API здійснював тонкий контроль над constвинятками, і зазвичай ці винятки приховуються у constметодах, що працюють на приватних даних.
(NB я маю на увазі до даних і метод видимості кілька разів. Я говорю про членів , позначених як суспільного проти приватного або захищаються який є зовсім інший тип захисту об'єкта обговорюється тут .)