mutableКлючевое слово является способом проколоть 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использование константного указателя или ссылки позволяет беспрепятственную запись и вызов метода для доступа к видимым элементам. По сравнениюmutable разработчик API должен осуществлять точный контроль над constисключениями, и обычно эти исключения скрыты в constметодах, работающих с частными данными.
(NB. Я несколько раз обращался к видимости данных и методов . Я говорю о членах, помеченных как открытые или закрытые или защищенные, что является совершенно другим типом защиты объектов, обсуждаемым здесь .)