Почему адрес адресата запрещен?
Стандарт С++ в 12.4.2 гласит, что
[...] Адрес деструктора не должен приниматься. [...]
Однако, без каких-либо жалоб компилятором можно взять адрес оболочки вокруг деструктора класса, например:
struct Test {
~Test(){};
void destructor(){
this->~Test();
}
};
void (Test::*d)() = &Test::destructor;
Итак, какое обоснование заставляет не принимать адрес деструктора напрямую?
Ответы
Ответ 1
Конструкторы и деструкторы несколько особенные. Компилятор часто
использует различные соглашения при их вызове (например, для передачи лишних скрытых
аргументы). Если вы взяли адрес и сохранили его где-то,
компилятор потеряет информацию о том, что функция является конструктором
или деструктор, и не знал бы использовать специальные соглашения.