Что может изменить метод const?
Без явного отбрасывания константы метод const
может измениться:
mutable
члены данных и - любые данные, к которым у класса нет доступа
const
, независимо от того, доступны ли эти данные: - через переменные-члены, которые являются указателями или ссылками,
- через указатели или ссылки, передаваемые в качестве параметров функции,
- через указатели или ссылки, возвращаемые функциями,
- непосредственно в пространстве имен или классе (для статики), в котором оно содержится.
Для членов типа class
/ struct
/ union
он зависит от постоянства их функций-членов, чтобы определить, какие операции должны быть разрешены.(Он также может изменять любые неконстантные локальные переменные и параметры по значению, но я знаю, что это не то, что вас интересует).
Он может вызывать другие const
методы, которые будут иметь такие же возможностии ограничения.
Например.если переменные экземпляра являются указателями, означает ли это, что указатели не изменены, или также что память, на которую они указывают, не изменилась?
Это означает, что указатели не могут быть (легко /случайно) поменял. не означает, что указанная память не может быть изменена.
На что вы наткнулись - это логическая некорректность функции const
, изменяющей указанную или на которую ссылаютсяДанные концептуально принадлежат объекту.Как вы обнаружили, компилятор не обеспечивает корректность const
, которую вы можете здесь ожидать.Это немного опасно, но означает, что constness не нужно явно удалять для указателей / ссылок на другие объекты, которые могут быть изменены как побочный эффект const
функции .Например, объект регистрации.(Как правило, такие объекты не являются логически «принадлежащими» объектам, чья функция const
работает с ними.) Ключевым моментом является то, что компилятор не может надежно различать тип логического владения, которое объект имеет над указанными данными.Таким образом, он должен угадать так или иначе и позволить программисту либо переопределить, либо не быть защищенным const
-ness.C ++ отказывается от защиты.
Интересно, я слышал, что язык D Уолтера Брайта переворачивает это значение по умолчанию, делая указанными данные const
по умолчанию в функциях const
.Это кажется мне более безопасным, хотя трудно представить, как часто в конечном итоге нужно будет явно отбрасывать константу, чтобы получить желаемые побочные эффекты, и будет ли это чувствовать себя достаточно точно или досадно многословно.