Crear un nuevo objeto de clase C con el operador new () da un error aquí:
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
Pero cuando sustituyo C() {}
con C() = default;
o elimino la línea para que el compilador inserta un constructor por defecto (que creo que tiene el mismo efecto con = default
), el código se compila y corre.
¿Cuáles son las diferencias entre el constructor predeterminado generado por el compilador y el constructor predeterminado definido por el usuario que hacen que esto suceda?
Tengo alguna pista en esta publicación , pero la clase C aquí (sin el constructor proporcionado por el usuario) no es trivial ya que el destructor es virtual, ¿verdad?
Compilado con la última versión de Visual Studio, c ++ 17.
operator delete()
si el constructor se escribe manualmente o se genera implícitamente Lo cual es coherente con mis expectativas: dado que la new
expresión puede generar una excepción , el compilador debe acceder operator delete()
.
noexcept
hará que el código se compile, pero ¿cómo ...?
noexcept
como SebastianRedl mencionó, entonces operator delete
no es necesario incluir una llamada . Además, g ++ solo se queja si el destructor es virtual. De lo contrario, siempre se compila, incluso si el constructor está lanzando.
noexcept