Может ли деструктор вызывать функцию non-const для объекта const?

Я искал ответ на этот вопрос и не смог его найти. Рассмотрим следующий код:

struct Foo
{
    int *bar;
    Foo(int barValue) : bar(new int(barValue)) {}
    ~Foo() { do_this(); }
    void do_this() { delete bar; bar = nullptr; }
};

int main()
{
    const Foo foo(7);
}

do_this() не может быть вызван для объекта const, поэтому я не мог бы сделать что-то вроде foo.do_this(). В некоторых ситуациях было бы do_this() вызвать do_this() вне деструктора, поэтому я не хочу просто включать код в определение деструктора. Поскольку do_this() изменяет переменную-член, я не могу объявить ее как const.

Мой вопрос: сможет ли деструктор вызвать do_this() для объекта const при уничтожении объекта?

Я попробовал это и не получил никаких ошибок, но хочу, чтобы я не вызывал утечку памяти после завершения моей программы.

Ответы

Ответ 1

Да, вы можете безоговорочно назвать неконстантные функции от деструктора. Стандарт явно позволяет это:

15.4/2 Деструктор используется для уничтожения объектов своего типа класса. Адрес деструктора не должен приниматься. Деструктор может быть вызван для const, volatile или const volatile. const и volatile semantics ([dcl.type.cv]) не применяются к уничтожаемому объекту. Они перестают действовать, когда начинается деструктор для самого производного объекта.