Подтвердить что ты не робот

Является ли деструктор рассмотренной функцией 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 специальное исключение?

4b9b3361

Ответ 1

Вы можете удалить объекты, которые будут содержать постоянные указатели. В С++ 11 вы также можете стирать элементы контейнера через константы-итераторы. Так что да, в некотором смысле деструктор всегда "постоянный".

После вызова деструктора объект перестает существовать. Я предполагаю, что вопрос о том, является ли несуществующий объект изменчивым или нет, является спорным.

Ответ 2

Время жизни объекта заканчивается (для области владельца/приложения), как только вызывается деструктор, а не когда деструктор возвращается.

Поэтому я не вижу проблем с удалением констант. Это уже было для вас, когда вы вызываете delete.

В противном случае для удаления константных объектов потребуется const_cast.