Utworzenie nowego obiektu klasy C za pomocą operatora new () powoduje błąd:
class C
{
public:
C() {}
virtual ~C() {}
void operator delete(void*) = delete;
};
int main()
{
C* c = new C;
}
z C2280: 'void C::operator delete(void *)': function was explicitly deleted
Ale kiedy wymienić C() {}
z C() = default;
lub usunąć linię tak, że kompilator wstawia konstruktor domyślny (który moim zdaniem ma taki sam skutek = default
), kod zostanie skompilowany i uruchomić.
Jakie są różnice między domyślnym konstruktorem generowanym przez kompilator a domyślnym konstruktorem zdefiniowanym przez użytkownika?
Mam trochę wskazówek w tym poście , ale klasa C tutaj (bez konstruktora podanego przez użytkownika) nie jest trywialna, ponieważ destruktor jest wirtualny, prawda?
Skompilowany z najnowszym Visual Studio, c ++ 17.
operator delete()
tego, czy konstruktor jest zapisywany ręcznie, czy też niejawnie. Co jest zgodne z moimi oczekiwaniami - ponieważ new
wyrażenie może generować wyjątek , kompilator musi uzyskać dostęp operator delete()
.
noexcept
spowoduje kompilację kodu, ale jak ...?
noexcept
tak, jak wspominał SebastianRedl, operator delete
nie trzeba dołączać wywołania . Również g ++ narzeka, tylko jeśli destruktor jest wirtualny. W przeciwnym razie zawsze się kompiluje, nawet jeśli konstruktor rzuca.
noexcept