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&) {}
};
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&) {}
};
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.
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
) Das scheint NICHT den Kopierkonstruktor aufzurufen. Http : //stackoverflow.com/questions/11037644/how-do-i-get-the-copy-constructor-called-over-a-variadic-constructor –
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.
Und können Standardparameter haben auch – FrozenHeart
@NikitaTrophimov: Ja, das auch. – Nawaz
Was passiert, wenn dies vor dem Template 'Foo (const Foo &) = delete;'? Hat die Klasse jetzt keinen Kopierkonstruktor oder wird die Vorlage stattdessen aufgerufen? – orlp
Wenn der Kopierkonstruktor gelöscht wird, hat die Klasse keinen. ;-) –
@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