Подтвердить что ты не робот

Почему адрес адресата запрещен?

Стандарт С++ в 12.4.2 гласит, что

[...] Адрес деструктора не должен приниматься. [...]

Однако, без каких-либо жалоб компилятором можно взять адрес оболочки вокруг деструктора класса, например:

struct Test {
    ~Test(){};

    void destructor(){
        this->~Test();
    }
};

void (Test::*d)() = &Test::destructor;

Итак, какое обоснование заставляет не принимать адрес деструктора напрямую?

4b9b3361

Ответ 1

Конструкторы и деструкторы несколько особенные. Компилятор часто использует различные соглашения при их вызове (например, для передачи лишних скрытых аргументы). Если вы взяли адрес и сохранили его где-то, компилятор потеряет информацию о том, что функция является конструктором или деструктор, и не знал бы использовать специальные соглашения.