son sobrecarga qué que los implementa ejemplos definicion copia constructores como c++ default-constructor implicits

c++ - sobrecarga - que son los constructores en c



Condiciones bajo las cuales el compilador no definirá implícitos(constructor, destructor, copia constructor, copia de asignación) (1)

El Conductor predeterminado (por ejemplo, X() ) no se generará implícitamente si:

  • Usted ha declarado explícitamente cualquier constructor en absoluto
  • hay un miembro de datos que no es construible por defecto (como una referencia, un objeto const , o una clase con un constructor predeterminado no accesible o inaccesible)
  • (C ++ 11) le ha dicho explícitamente al compilador que no genere uno usando X() = delete;

El Constructor de Copias (por ejemplo, X(const X&) ) no se generará implícitamente si:

  • ha declarado explícitamente un constructor de copia (para la clase X un constructor que toma X , X& o const X& )
  • hay un miembro de datos que no es construible por copia (como una clase sin o un constructor de copia inaccesible)
  • La clase base no es construible por copia.
  • (C ++ 11) ha declarado un constructor de movimiento o un operador de asignación de movimiento
  • (C ++ 11) le ha dicho explícitamente al compilador que no genere uno usando X(const X&) = delete;

El Operador de asignación de copias (por ejemplo, X& operator=(const X&) ) no se generará implícitamente si:

  • ha declarado explícitamente un operador de asignación de copia (para la clase X un operator= tomar X , X& o const X& )
  • hay un miembro de datos en su clase que no se puede asignar a la copia (como una referencia, un objeto const o una clase con un operador de asignación no accesible o inaccesible)
  • la clase base no es asignable por copia
  • (C ++ 11) ha declarado un constructor de movimiento o un operador de asignación de movimiento
  • (C ++ 11) le ha dicho explícitamente al compilador que no genere uno usando X& operator=(const X&) = delete;

El Destructor (por ejemplo, ~X() ) no se generará implícitamente si:

  • Has declarado explícitamente un destructor
  • (C ++ 11) le ha dicho explícitamente al compilador que no genere uno usando ~X() = delete;

El constructor de movimiento (C ++ 11) (por ejemplo, X(X&&) ) no se generará implícitamente si:

  • ha declarado explícitamente un constructor de movimiento (para la clase X , un constructor que toma X&& )
  • ha declarado un operador de asignación de copia, un constructor de copia, un destructor o un operador de asignación de movimiento
  • hay un miembro de datos en su clase que no puede ser construido por movimiento (es const , es una referencia, o tiene un constructor de movimiento eliminado, inaccesible o ambiguo)
  • la clase base no puede ser construida por movimiento
  • le ha dicho explícitamente al compilador que no genere uno usando X(X&&) = delete;

El operador de asignación de movimientos (C ++ 11) (por ejemplo, X& operator=(X&&) ) no se generará implícitamente si:

  • ha declarado explícitamente un operador de asignación de movimiento (para la clase X , un operator= tomando X&& )
  • ha declarado un operador de asignación de copia, constructor de copia, destructor o constructor de movimiento
  • hay un miembro de datos en su clase que no se puede asignar al movimiento (es const , es una referencia, o tiene un operador de asignación de movimiento eliminado, inaccesible o ambiguo)
  • la clase base no puede ser asignada por movimiento
  • le ha dicho explícitamente al compilador que no genere uno usando X& operator=(X&&) = delete;

Se supone que esta es una pregunta trivial, pero no pude encontrarla explícitamente en stackoverflow.

Lo siguiente se definirá implícitamente si no lo proporciona el usuario.

  1. constructor por defecto (sin parámetros)
  2. copia constructor
  3. operador de asignación de copia
  4. incinerador de basuras

Pero he leído en algún lugar (que no puedo encontrar ahora), que hay algunas condiciones en las que el compilador no las implementará implícitamente.

¿Cuáles son estas condiciones?