Интересная штука получается с константными объектами. Не константные функции у них вызывать нельзя. То есть получается, что и деструктор звать нельзя. Потому что деструктор const объявлять нельзя. Конструктор, кстати, тоже нельзя. ( Я знаю, что на слово вы мне не поверите, поэтому привела куски из Стандарта в конце поста ).
В связи с чем возникают вопросы. А что будет вот с таким кодом? Будет ли вызван деструктор при выходе из блока?
{
const CMyClass p;
}
А вот это как же? Скомпилируется?
{
const int* p = new int(10);
delete p;
}
На самом деле всё здесь нормально и всё компилируется и работает. Потому что для деструктора сделано исключение и его можно звать для константных объектов.
Об этом лучше помнить, чтобы потом не писать вот так:
delete const_cast<ReferenceCounter*>(this);
Куски из Стандарта по теме:
[class.dtor] 12.4/2:
A destructor is used to destroy objects of its class type. A
destructor takes no parameters, and no return type can be specified
for it (not even void). The address of a destructor shall not be
taken. A destructor shall not be static. A destructor can be invoked
for a const, volatile or const volatile object. A destructor shall
not be declared const, volatile or const volatile (9.3.2). const and
volatile semantics (7.1.5.1) are not applied on an object under
destruction. Such semantics stop being into effect once the destructor for the most derived object (1.8) starts.
[expr.delete] 5.3.5/2:
[Note: a pointer to a const type can be the operand of a
delete-expression; it is not necessary to cast away the
constness (5.2.11) of the pointer expression before it
is used as the operand of the delete-expression. ]
Ссылки по теме:
comp.lang.c++.moderated - Delete a const pointer?
comp.lang.c++.moderated - Why can operator delete be called on a const pointer?