C ++ 17 N4659 borrador estándar
Para una referencia estándar cruzada rápida, eche un vistazo a las secciones "Declaradas implícitamente" de las siguientes entradas de cppreference:
La misma información, por supuesto, se puede obtener de la norma. Por ejemplo, en C ++ 17 N4659 borrador estándar :
15.8.1 "Copiar / mover constructores" dice para el constructor de copias:
6 Si la definición de clase no declara explícitamente un constructor de copia, una no explícita se declara implícitamente. Si la definición de clase declara un constructor de movimiento o un operador de asignación de movimiento, el constructor de copia declarado implícitamente se define como eliminado; de lo contrario, se define como predeterminado (11.4). El último caso está en desuso si la clase tiene un operador de asignación de copia declarado por el usuario o un destructor declarado por el usuario.
y para mover constructor:
8 Si la definición de una clase X no declara explícitamente un constructor de movimiento, uno no explícito se declarará implícitamente como predeterminado si y solo si
(8.1) - X no tiene un constructor de copia declarado por el usuario,
(8.2) - X no tiene un operador de asignación de copia declarado por el usuario,
(8.3) - X no tiene un operador de asignación de movimiento declarado por el usuario, y
(8.4) - X no tiene un destructor declarado por el usuario.
15.8.2 "Operador de asignación de copiar / mover" dice para la asignación de copia:
2 Si la definición de clase no declara explícitamente un operador de asignación de copia, uno se declara implícitamente. Si la definición de clase declara un constructor de movimiento o un operador de asignación de movimiento, el operador de asignación de copia declarado implícitamente se define como eliminado; de lo contrario, se define como predeterminado (11.4). El último caso está en desuso si la clase tiene un constructor de copia declarado por el usuario o un destructor declarado por el usuario.
y para la asignación de movimiento:
4 Si la definición de una clase X no declara explícitamente un operador de asignación de movimiento, uno se declarará implícitamente como predeterminado si y solo si
- (4.1) - X no tiene un constructor de copia declarado por el usuario,
- (4.2) - X no tiene un constructor de movimiento declarado por el usuario,
- (4.3) - X no tiene un operador de asignación de copia declarado por el usuario, y
- (4.4) - X no tiene un destructor declarado por el usuario.
15.4 "Destructores" lo dice para destructores:
4 Si una clase no tiene un destructor declarado por el usuario, un destructor se declara implícitamente como predeterminado (11.4). Un destructor declarado implícitamente es un miembro público en línea de su clase.