Считается ли деструктор константной функцией? - PullRequest
22 голосов
/ 04 декабря 2011

Рассмотрим это

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 и non const функции Foo

Попытка вызова любой неконстантной функции приводит к ошибке в Visual Studio, например:

error C2662: 'Foo::NonConstBar' : cannot convert 'this' pointer from 'const Foo' to 'Foo &'

Но delete pFoo не выдает такой ошибки. Оператор delete обязан вызывать деструктор класса Foo , который не имеет модификатора const. Деструктору также разрешено вызывать другие неконстантные функции-члены. Так это константная функция или нет? Или удаление по константному указателю является специальным исключением?

Ответы [ 2 ]

20 голосов
/ 04 декабря 2011

Вы можете удалять объекты с помощью постоянных указателей.В C ++ 11 вы также можете удалять элементы контейнера через const-итераторы.Так что да, в некотором смысле деструктор всегда «постоянен».

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

5 голосов
/ 04 декабря 2011

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

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

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

...