Подлинно const
объекты могут рассматриваться компилятором как допустимые константы.Он может предположить, что их значения никогда не изменятся, или даже сохранить их в const
памяти, например, ROM или Flash.Таким образом, вам нужно использовать неконстантный путь доступа, предоставленный this
, если объект фактически не является константой.Это условие существует только во время строительства и разрушения объекта.
Необязательно, я думаю, что не должно быть соответствующего требования для деструкторов, потому что время жизни объекта уже закончилось и cobj.c
недоступен, как только деструктор дляcobj
начинается.
Как упоминает Матье, это сильный "кодовый запах" доступа к объекту, кроме как через this
во время строительства или разрушения.Изучая C ++ 11 §3.8 [basic.life] ¶1 и 6, может показаться, что cobj.c
внутри конструктора является UB по той же причине, что и внутри деструктора, независимо от того, является ли объект const
или §12.1/ 14, поскольку его время жизни не начинается до тех пор, пока инициализация не завершится (конструктор вернется).
Вероятно, это сработает, но это вызовет сигналы тревоги для хороших программистов на C ++, и согласно книге это недопустимо.