Das Erstellen eines neuen Objekts der Klasse C mit dem Operator new () führt hier zu einem Fehler:
class C
{
public:
C() {}
virtual ~C() {}
void operator delete(void*) = delete;
};
int main()
{
C* c = new C;
}
mit C2280: 'void C::operator delete(void *)': function was explicitly deleted
Aber wenn ich ersetzen C() {}
mit C() = default;
oder die Zeile entfernen , so dass Compiler einen Standardkonstruktor fügt (was ich glaube die gleiche Wirkung mit hat = default
), wird der Code kompiliert und ausgeführt.
Was sind die Unterschiede zwischen dem vom Compiler generierten Standardkonstruktor und dem benutzerdefinierten Standardkonstruktor, die dies ermöglichen?
Ich habe einen Hinweis in diesem Beitrag erhalten , aber Klasse C hier (ohne vom Benutzer bereitgestellten Konstruktor) ist nicht trivial, da der Destruktor virtuell ist, oder?
Kompiliert mit dem neuesten Visual Studio, c ++ 17.
operator delete()
ob der Konstruktor manuell geschrieben oder implizit generiert wird. Dies entspricht meinen Erwartungen - da der new
Ausdruck möglicherweise eine Ausnahme auslöst, muss der Compiler darauf zugreifen operator delete()
.
noexcept
wird der Code kompiliert, aber wie ...?
noexcept
um SebastianRedl handelt, muss ein Aufruf von operator delete
nicht enthalten sein. Auch g ++ beschwert sich nur, wenn der Destruktor virtuell ist. Andernfalls wird immer kompiliert, auch wenn der Konstruktor wirft.
noexcept