Почему деструктор должен быть доступен, даже если он не вызывается?C++

Программы на C++. Форум разработчиков
Anonymous
Почему деструктор должен быть доступен, даже если он не вызывается?

Сообщение Anonymous »

Имея класс X, следующая инициализация объекта:

Код: Выделить всё

new (ptr) X(X());
требуется доступный деструктор, начиная с C++17. Почему это происходит, когда объект инициализируется конструктором по умолчанию непосредственно в хранилище, на которое указывает ptr, поэтому не нужно использовать временный объект?
Пример кода:

Код: Выделить всё

struct X {
X() { }
X(const X&) = delete;
X(X&&) = delete;
~X() = delete;  // or, e.g, private
};

void test(void* ptr) {
new (ptr) X(X());  // error: attempt to use a deleted function
}
Демо: https://godbolt.org/z/Khac1z8r3
ОБНОВЛЕНИЕ
Это аналогичный вопрос: почему публичный деструктор необходим для обязательного RVO в C++?. Но мой случай другой, поскольку в моем коде проблема потенциальных вызовов деструктора из-за исключений не возникает (или, по крайней мере, я ее там не вижу).

Подробнее здесь: https://stackoverflow.com/questions/787 ... not-called

Вернуться в «C++»