Создание нового объекта класса C с оператором new () выдает здесь ошибку:
class C
{
public:
C() {}
virtual ~C() {}
void operator delete(void*) = delete;
};
int main()
{
C* c = new C;
}
с C2280: 'void C::operator delete(void *)': function was explicitly deleted
Но когда я заменяю C() {}
с C() = default;
или удалить строку , так что компилятор вставляет конструктор по умолчанию (который я считаю , имеет тот же эффект с = default
), код будет компиляция и запуск.
Каковы различия между созданным компилятором конструктором по умолчанию и определяемым пользователем конструктором по умолчанию, которые делают это возможным?
Я получил некоторую подсказку в этой публикации , но класс C здесь (без предоставленного пользователем конструктора) не тривиален, так как деструктор является виртуальным, верно?
Скомпилировано с последней версией Visual Studio, c ++ 17.
operator delete()
того, написан ли конструктор вручную или неявно сгенерирован. Что согласуется с моими ожиданиями - поскольку выражение может вызывать исключение new
, компилятору необходим доступ operator delete()
.
noexcept
сделает компиляцию кода, но как ...?
noexcept
как упомянул SebastianRedl, вызов operator delete
не должен быть включен. Также g ++ только жалуется, если деструктор является виртуальным. В противном случае он всегда компилируется, даже если конструктор выбрасывает.
noexcept