Создание нового объекта класса 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.
noexcept
- person Sebastian Redl   schedule 12.02.2020operator delete()
, написан ли конструктор вручную или неявно сгенерирован. Что согласуется с моими ожиданиями — поскольку выражениеnew
может вызвать исключение, компилятору необходимо получить доступ кoperator delete()
. - person Peter   schedule 12.02.2020noexcept
заставит код скомпилироваться, но как ...? - person yeshjho   schedule 12.02.2020noexcept
, как упомянул СебастьянРедл, тогда нет необходимости включать вызовoperator delete
. Также g++ жалуется, только если деструктор виртуальный. В противном случае он всегда компилируется, даже если конструктор вызывает исключение. - person walnut   schedule 12.02.2020