c++ c++11 move-semantics virtual-destructor

c++ - ¿Un destructor virtual predeterminado evita las operaciones de movimiento generadas por el compilador?



c++> class constructor (1)

Sí, declarar cualquier destructor impedirá la declaración implícita del constructor de movimiento.

N3337 [class.copy]/9: Si la definición de una clase X no declara explícitamente un constructor de movimiento, uno se declarará implícitamente como predeterminado si y solo si

  • X no tiene un constructor de copia declarado por el usuario,
  • X no tiene un operador de asignación de copia declarado por el usuario,
  • X no tiene un operador de asignación de movimiento declarado por el usuario,
  • X no tiene un destructor declarado por el usuario , y
  • el constructor de movimiento no se definiría implícitamente como eliminado.

Declarar el destructor y definirlo como recuento default como declarado por el usuario .

Deberá declarar el constructor de movimiento y definirlo como default usted mismo:

WidgetBase(WidgetBase&&) = default;

Tenga en cuenta que esto, a su vez, definirá el constructor de copia como delete , por lo que también deberá default ese:

WidgetBase(const WidgetBase&) = default;

Las reglas para los operadores de asignación de copia y movimiento también son bastante similares, por lo que tendrá que default si las desea.

Inspirado por la publicación ¿Por qué el destructor deshabilita la generación de métodos de movimiento implícitos? , Me preguntaba si lo mismo es cierto para el destructor virtual predeterminado, por ejemplo,

class WidgetBase // Base class of all widgets { public: virtual ~WidgetBase() = default; // ... };

Como la clase está destinada a ser una clase base de una jerarquía de widgets, tengo que definir su destructor virtual para evitar pérdidas de memoria y un comportamiento indefinido cuando se trabaja con punteros de clase base. Por otro lado, no quiero evitar que el compilador genere automáticamente las operaciones de movimiento.

¿Un destructor virtual predeterminado evita las operaciones de movimiento generadas por el compilador?