2012-06-12 11 views
6

De acuerdo con el estándar de C++ 11 un constructor por defecto medida sólo se genera si:explícitamente incumplido movimiento constructor

  • X no tiene un constructor de copia-declarada de usuario y
  • X no tiene una -declarada de usuario operador de asignación de copia,
  • X no tiene un operador de asignación de mudanza declarada usuario,
  • X no tiene un destructor-declarada de usuario y
  • el constructor medida podría no ser definido implícitamente como eliminado

¿Puedo seguir explícitamente predeterminado? Parece que funciona 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; 
}; 

Respuesta

10

La motivación para que la regla es que si el constructor de copia por defecto no funciona para su clase, entonces es probable que el valor por defecto movimiento constructor tampoco funcionará (regla de 5, o lo que sea que hagamos en C++ 11). Entonces, sí, puedes ponerlo por defecto explícitamente, en tu 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.

3

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

Cuestiones relacionadas