Constructor de movimiento explícitamente predeterminado

De acuerdo con el estándar c++11, un constructor de movimiento predeterminado solo se genera si:

  • X no tiene un constructor de copia declarado por el usuario, y
  • 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.

¿Todavía puedo hacerlo explícitamente por defecto? Parece funcionar correctamente en clang. Así por ejemplo:

class MyClass {
private:
  std::vector<int> ints;
public:
  MyClass(MyClass const& other) : ints(other.ints) {}
  MyClass(MyClass&& other) = default;
};

preguntado el 12 de junio de 12 a las 20:06

2 Respuestas

La motivación para esa regla es que si el constructor de copia predeterminado no funciona para su clase, entonces es probable que el constructor de movimiento predeterminado tampoco funcione (regla de 5, o lo que sea que estemos haciendo en C++ 11) . Entonces, sí, puede hacerlo explícitamente por defecto, en su honor como programador que funcionará.

En su código de ejemplo, podría eliminar el constructor de copia, ya que hace lo mismo que el predeterminado.

Respondido el 12 de junio de 12 a las 20:06

Sí, siempre puede invocar explícitamente la generación predeterminada para funciones que se pueden generar automáticamente con = default. Para eso está la sintaxis.

Respondido el 12 de junio de 12 a las 20:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.