Может ли деструктор вызывать функцию 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]) не применяются к уничтожаемому объекту. Они перестают действовать, когда начинается деструктор для самого производного объекта.