La creazione di un nuovo oggetto di classe C con l'operatore new () genera un errore qui:
class C
{
public:
C() {}
virtual ~C() {}
void operator delete(void*) = delete;
};
int main()
{
C* c = new C;
}
con C2280: 'void C::operator delete(void *)': function was explicitly deleted
Ma quando sostituisce C() {}
con C() = default;
o rimuovere la riga in modo che compilatore inserisce un costruttore di default (che ritengo ha lo stesso effetto con = default
), il codice verrà compilare ed eseguire.
Quali sono le differenze tra il costruttore predefinito generato dal compilatore e il costruttore predefinito definito dall'utente che lo rendono possibile?
Ho avuto qualche suggerimento in questo post , ma la classe C qui (senza costruttore fornito dall'utente) non è banale poiché il distruttore è virtuale, giusto?
Compilato con l'ultimo Visual Studio, c ++ 17.
operator delete()
stabilire se il costruttore è scritto manualmente o generato implicitamente. Il che è coerente con le mie aspettative - poiché l' new
espressione può generare un'eccezione , il compilatore deve accedere operator delete()
.
noexcept
farà compilare il codice, ma come ...?
noexcept
come menzionato SebastianRedl, operator delete
non è necessario includere una chiamata . Inoltre g ++ si lamenta solo se il distruttore è virtuale. Altrimenti si compila sempre, anche se il costruttore sta lanciando.
noexcept