La création d'un nouvel objet de classe C avec l'opérateur new () donne une erreur ici:
class C
{
public:
C() {}
virtual ~C() {}
void operator delete(void*) = delete;
};
int main()
{
C* c = new C;
}
avec C2280: 'void C::operator delete(void *)': function was explicitly deleted
Mais quand je remplacerai C() {}
avec C() = default;
ou supprimer la ligne de sorte que le compilateur insère un constructeur par défaut (qui je crois , a le même effet = default
), le code compiler et exécuter.
Quelles sont les différences entre le constructeur par défaut généré par le compilateur et le constructeur par défaut défini par l'utilisateur qui rendent cela possible?
J'ai un indice dans cette publication , mais la classe C ici (sans constructeur fourni par l'utilisateur) n'est pas anodine car le destructeur est virtuel, non?
Compilé avec la dernière version de Visual Studio, c ++ 17.
operator delete()
si le constructeur est écrit manuellement ou généré implicitement. Ce qui est conforme à mes attentes - puisqu'une exception peut être levée par l' new
expression, le compilateur doit y accéder operator delete()
.
noexcept
fera compiler le code, mais comment ...?
noexcept
comme SebastianRedl l'a mentionné, alors un appel à operator delete
n'a pas besoin d'être inclus. De plus, g ++ ne se plaint que si le destructeur est virtuel. Sinon, il compile toujours, même si le constructeur lance.
noexcept