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' newexpression, le compilateur doit y accéder operator delete().
noexceptfera compiler le code, mais comment ...?
noexceptcomme SebastianRedl l'a mentionné, alors un appel à operator deleten'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