2012-09-11 13 views
8

Gegeben den folgenden Code, hat Foo Kopie Konstruktor? Ist es sicher, Foo mit STL-Containern zu verwenden?Vorlage kopieren Konstruktor

class Foo 
{ 
public: 
    Foo() {} 

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

Antwort

10

Der Standard sagt ausdrücklich, dass eine Kopie Konstruktor ein Nicht-Template-Konstruktor ist, die einen Verweis auf ein möglicherweise const-flüchtiges Objekt des gleichen Typs nimmt. Im obigen Code haben Sie eine Umwandlung, aber nicht Kopie Konstruktor (d. H. Es wird für alles aber Kopien verwendet, wo der implizit deklarierte Konstruktor verwendet wird).

Hat Foo einen Kopierkonstruktor?

Ja, der implizit deklarierte/definierte Kopierkonstruktor.

Ist die Verwendung von Foo mit Standardbibliothekscontainern sicher?

Mit der aktuellen Definition von Foo es ist, aber im allgemeinen Fall, es hängt davon ab, welche Mitglieder Foo hat und ob der implizit definiert Copykonstruktor verwaltet korrekt diejenigen.

+0

Was passiert, wenn dies vor dem Template 'Foo (const Foo &) = delete;'? Hat die Klasse jetzt keinen Kopierkonstruktor oder wird die Vorlage stattdessen aufgerufen? – orlp

+1

Wenn der Kopierkonstruktor gelöscht wird, hat die Klasse keinen. ;-) –

+0

@nightcracker dann gibt es keinen Kopierkonstruktor und der Compiler gibt einen Fehler (es sei denn, Sie haben einen Ausdruck, wo beispielsweise der Kopierkonstruktor für die Verschiebung verwendet werden könnte). Der Schlüssel ist, dass der Kopierkonstruktor * nicht-templatiert * ist. – juanchopanza

1

Foo hat einen vom Compiler erzeugten Kopierkonstruktor, der nicht durch den von Ihnen bereitgestellten Vorlagenkonvertierungskonstruktor ersetzt werden kann.

Foo f0; 
Foo f1(f0); // calls compiler-synthesized copy constructor 
Foo f2(42); // calls template conversion constructor with T=int 
+0

) Das scheint NICHT den Kopierkonstruktor aufzurufen. Http : //stackoverflow.com/questions/11037644/how-do-i-get-the-copy-constructor-called-over-a-variadic-constructor –

4

nach dem Standard, eine Kopie-Konstruktor muss eine der folgenden Unterschrift sein:

Foo(Foo &); 
Foo(Foo const &); 
Foo(Foo volatile &); 
Foo(Foo const volatile &); 

Foo(Foo&, int = 0,); 
Foo(Foo&, int = 0, float = 1.0); //i.e the rest (after first) of the 
           //parameter(s) must have default values! 

Da die Template-Konstruktor in Ihrem Code nicht mit der Form einer der oben genannten nicht überein das ist nichtkopieren -Konstruktor.

+1

Und können Standardparameter haben auch – FrozenHeart

+0

@NikitaTrophimov: Ja, das auch. – Nawaz

Verwandte Themen