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