2012-06-13 9 views
7

¿Un constructor con plantilla (como el siguiente) anula el constructor de copia implícito?¿Un constructor con plantilla reemplaza el constructor de copia implícita en C++?

template <class T> 
struct Foo 
{ 
    T data; 

    // ... 

    template <class U> 
    Foo(const Foo<U> &other) : data((T)doSomethingWith(other.data)) {} 

    // ... 
}; 

Si es así, ¿todavía anularla si other se pasa por valor en lugar de referencia constante?

Si es así, ¿hay alguna forma de evitar esto sin definir explícitamente un constructor de copia?

Respuesta

7

No, eso no es un constructor de copia. Sección 12.8 ([class.copy]) de la Norma requiere que:

Un constructor no molde para la clase X es un constructor de copia si su primer parámetro es de tipo X&, const X&, volatile X& o const volatile X&, y, o bien no hay otras parámetros o todos los otros parámetros tienen argumentos predeterminados.

El compilador generará implícitamente uno predeterminado.

Usted puede hacer que explícita (requiere C++ 11) por

Foo(const Foo<T>&) = default; 
2

¿Tiene un constructor de plantilla (como la siguiente) anular el constructor de copia implícita?

No. El constructor de copia todavía se declara implícitamente y se elige con preferencia a la plantilla.

¿Hay alguna forma de evitar esto sin definir explícitamente un constructor de copia?

No. Si no desea el constructor de copia implícita, tendrá que definir uno usted mismo.

2

Un constructor o cesión operador de plantilla que se parece a una plantilla de [constructor por defecto/constructor de copia/movimiento constructor/copiar operador de asignación/operador de asignación movimiento] no es realmente un [constructor por defecto/constructor de copia/movimiento constructor/copia operador de asignación/operador de asignación de movimiento] y no lo reemplazará ni impedirá que se genere implícitamente.

+0

La idea es correcta, pero lo que escribiste está mal. ¿Quieres decir "Un constructor de copia no ..."? Eso es falso ¿Quieres decir "Un constructor de copia con plantilla no ..."? No existe tal cosa. –

+0

@BenVoigt Slthough Creo que estaba claro antes, traté de hacerlo más exacto, aunque ahora creo que es más confuso. – David

Cuestiones relacionadas