Criar um novo objeto da classe C com o operador new () gera um erro aqui:
class C
{
public:
C() {}
virtual ~C() {}
void operator delete(void*) = delete;
};
int main()
{
C* c = new C;
}
com C2280: 'void C::operator delete(void *)': function was explicitly deleted
Mas quando eu substituir C() {}
com C() = default;
ou remover a linha para que compilador insere um construtor padrão (que eu acredito que tem o mesmo efeito com = default
), o código irá compilar e executar.
Quais são as diferenças entre o construtor padrão gerado pelo compilador e o construtor padrão definido pelo usuário que fazem isso acontecer?
Eu recebi alguma dica nesta postagem , mas a classe C aqui (sem construtor fornecido pelo usuário) não é trivial, pois o destruidor é virtual, certo?
Compilado com o mais recente Visual Studio, c ++ 17.
operator delete()
se o construtor é escrito manualmente ou gerado implicitamente. O que é consistente com minhas expectativas - como uma exceção pode ser lançada pela new
expressão, o compilador precisa acessar operator delete()
.
noexcept
fará o código compilar, mas como ...?
noexcept
como SebastianRedl mencionou, uma chamada para operator delete
não precisar ser incluída. Além disso, o g ++ apenas reclama se o destruidor é virtual. Caso contrário, ele sempre compila, mesmo se o construtor estiver jogando.
noexcept