2011-04-11 18 views

Respuesta

5

Las respuestas aquí son correctas pero no completas. Son correctos para C++ 98 y C++ 03. En C++ 11 no obtendrá un constructor de copia si ha declarado un constructor de movimiento o un operador de asignación de movimiento. Además, si ha declarado un operador de asignación de copia o un destructor, la generación implícita del constructor de copia queda obsoleta. 12.8 [class.copy]:

Si la definición de clase no declarar explícitamente un constructor de copia, no hay declarados de movimiento de usuarios constructor, y no hay -declarada de usuario operador de asignación movimiento , un constructor de copia es declarado implícitamente como predeterminado (8.4.2). Dicha declaración implícita está en desuso si la clase tiene un operador de asignación de copias declarado por el usuario o un destructor declarado por el usuario.

+0

¿Por qué estaban obsoletos? Mi destructor es virtual, pero está vacío. ¿Realmente me veo obligado a forzar la generación de constructores de copia? ¿Supongo que puedo usar 'default'? –

+0

@JanusTroelsen: Tengo una explicación en esta respuesta: http://stackoverflow.com/a/11255258/576911 Y sí, puedes usar '= default'. –

3

No. Obtendrá un constructor de copia predeterminado a menos que proporcione su propio constructor de copia, y la presencia o ausencia de un destructor no hace ninguna diferencia.

1

El constructor de copia predeterminado siempre se crea, a menos que defina el suyo propio. El constructor sin argumentos no se define con ningún otro constructor presente para evitar llamarlo y, por lo tanto, omitir el código del constructor real.

+0

Gracias por explicar el motivo de este comportamiento) – Septagram

3

No. Y cuenta que

MyClass 
{ 
    template <typename T> MyClass(const T&); 
}; 

no proporciona un constructor de copia, y se genera un defecto. objetos

+0

¿Por qué no? Incluso si no solo está declarado, ¿pero también está definido? Incluso si hay una especialización (plantilla <> MyClass :: MyClass (const MyClass &) {...})? – Septagram

+0

@Septagram: no. Las especializaciones no cambian el trato, y no se toman en cuenta para la resolución de sobrecarga. El constructor de copia ** debe ** ser una función no plantilla, punto. –

+0

Eso es extraño. Pero está bien, gracias :) – Septagram

9

12.8 # 4 clase copia

Si la definición de clase no declarar explícitamente un constructor de copia, uno se declara implícitamente

Y el destructor no desempeña ningún papel

+0

Puntos de bonificación por cotización) – Septagram

Cuestiones relacionadas