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 я маю на увазі до даних і метод видимості кілька разів. Я говорю про членів , позначених як суспільного проти приватного або захищаються який є зовсім інший тип захисту об'єкта обговорюється тут .)