wake-up-neo.com

Warum betrachtet der Standard einen Vorlagenkonstruktor nicht als Kopierkonstruktor?

Hier ist die Definition des Kopierkonstruktors [class.copy.ctor/1] :

Ein Nicht-Template-Konstruktor für Klasse X ist ein Kopierkonstruktor, wenn sein erster Parameter vom Typ X &, const X &, flüchtiges X & oder const flüchtiges X & ist und entweder keine anderen Parameter vorhanden sind oder alle anderen Parameter Standardargumente haben ([dcl. fct.default]).

Warum schließt der Standard Vorlagen als Kopierkonstruktoren aus?

In diesem einfachen Beispiel sind beide Konstruktoren Kopierkonstruktoren:

struct Foo {
    Foo(const Foo &); // copy constructor
    Foo(Foo &);       // copy constructor
};

Siehe dieses ähnliche Beispiel:

struct Foo {
     Foo() = default;

     template <typename T>
     Foo(T &) {
         printf("here\n");
     }
};

int main() {
    Foo a;
    Foo b = a;
}

In diesem Beispiel wird here gedruckt. Mein Vorlagenkonstruktor scheint also ein Kopierkonstruktor zu sein, zumindest verhält er sich wie einer (er wird in einem Kontext aufgerufen, in dem normalerweise Kopierkonstruktoren aufgerufen werden).

Warum ist dort im Text die Anforderung "Nicht-Vorlage"?

32
geza

Ein Kopierkonstruktor hat die Form X (X &) oder (X const &) und wird Ihnen vom Compiler zur Verfügung gestellt, wenn Sie selbst keinen deklariert haben. Nicht-Vorlage kommt hier wahrscheinlich aufgrund von Problemen, wenn Sie Vorlagenklassen verwenden.

Angenommen, es gibt eine Vorlagenklasse mit einem Vorlagenkopierkonstruktor. Das Problem besteht darin, dass Ihr Instanzenkopierkonstruktor nicht aufgerufen wird, wenn Sie diese Klasse mit einer anderen Instanz dieser Klasse mit demselben Vorlagentyp instanziieren.

Das Problem ist nicht, dass Ihre Kopierkonstruktorvorlage nicht übereinstimmt. Das Problem ist, dass der implizite Kopierkonstruktor keine Funktionsvorlage ist und Nichtvorlagen gegenüber Vorlagenspezialisierungen bevorzugt werden, wenn es um die Überlastungsauflösung geht.

Quelle: C++ - Vorlagenkonstruktionskonstruktor für Vorlagenklasse

0
BlackFurry