Является ли деструктор рассмотренной функцией const?
Рассмотрим это
class Foo
{
public:
Foo(){}
~Foo(){}
void NonConstBar() {}
void ConstBar() const {}
};
int main()
{
const Foo* pFoo = new Foo();
pFoo->ConstBar(); //No error
pFoo->NonConstBar(); //Compile error about non const function being invoked
delete pFoo; //No error
return 0;
}
В основной функции я вызываю const и не const функции Foo
Попытка вызвать любую функцию non const дает ошибку в Visual Studio, например,
error C2662: 'Foo::NonConstBar' : cannot convert 'this' pointer from 'const Foo' to 'Foo &'
Но delete pFoo
не выдает такой ошибки. Оператор delete связан с вызовом деструктора класса Foo, который не имеет модификатора const. Деструктору также разрешено вызывать другие функции non const member. Так это функция const или нет? Или удаляет ли указатель const специальное исключение?
Ответы
Ответ 1
Вы можете удалить объекты, которые будут содержать постоянные указатели. В С++ 11 вы также можете стирать элементы контейнера через константы-итераторы. Так что да, в некотором смысле деструктор всегда "постоянный".
После вызова деструктора объект перестает существовать. Я предполагаю, что вопрос о том, является ли несуществующий объект изменчивым или нет, является спорным.
Ответ 2
Время жизни объекта заканчивается (для области владельца/приложения), как только вызывается деструктор, а не когда деструктор возвращается.
Поэтому я не вижу проблем с удалением констант. Это уже было для вас, когда вы вызываете delete.
В противном случае для удаления константных объектов потребуется const_cast.