Constructor de movimiento explícitamente predeterminado
Frecuentes
Visto 3,128 veces
9
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;
};
2 Respuestas
12
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
4
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 c++ constructor c++11 clang default-constructor or haz tu propia pregunta.