2012-06-13 20 views
7

Un costruttore di modelli (come il seguente) sovrascrive il costruttore di copie implicite?Un costruttore con modello sostituisce il costruttore implicito di copia in C++?

template <class T> 
struct Foo 
{ 
    T data; 

    // ... 

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

    // ... 
}; 

Se è così, ha ancora la precedenza, se other viene passato per valore piuttosto che di riferimento costante?

In tal caso, esiste un modo per aggirare questo senza definire esplicitamente un costruttore di copie?

risposta

7

No, non è un costruttore di copie. Sezione 12.8 ([class.copy]) dello Standard richiede che:

Un costruttore non template per la classe X è un costruttore di copia se il suo primo parametro è di tipo X&, const X&, volatile X& o const volatile X&, eo non esistono altre parametri o tutti gli altri parametri hanno argomenti predefiniti.

Il compilatore genererà ancora implicitamente un valore predefinito.

si può fare che esplicita (richiede C++ 11)

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

Fa un costruttore su modelli (come la seguente) ignorare il costruttore di copia implicita?

No. Il costruttore di copia è ancora implicitamente dichiarato ed è scelto in preferenza rispetto al modello.

C'è un modo per aggirare questo senza definire esplicitamente un costruttore di copie?

No. Se non si desidera il costruttore di copia implicito, è necessario definirne uno da soli.

2

Un costruttore o la cessione dell'operatore template che assomiglia a una su modelli [costruttore di default/costruttore di copia/spostamento costruttore/copia operatore di assegnazione/operatore di assegnazione mossa] non è davvero un [costruttore di default/costruttore di copia/spostamento costruttore/copia operatore di assegnazione/operatore di assegnazione del movimento] e non lo sostituirà né impedirà che venga generato in modo implicito.

+0

L'idea è giusta, ma quello che hai scritto è sbagliato. Intendi "Un costruttore di copie non ..."? Questo è falso. Intendi "Un costruttore di copia basato su modelli non ..."? Non vi è nulla di simile. –

+0

@ BenVoigt Anche se penso che fosse chiaro prima, ho cercato di renderlo più preciso, anche se penso che ora sia più confuso. – David

Problemi correlati