Es gibt einen Kopierkonstruktor - den nicht-templateten.
Der Vorlagenkonstruktor und der Zuweisungsoperator erlauben die Zuweisung von Zeigertypen, für die ein implizites existiert:
%Vor% Ohne die Template-Versionen würde (*) nicht funktionieren, da der Compiler auto_ptr<A>
als völlig anderen Typ behandelt als auto_ptr<B>
.
Weil Kopierkonstruktoren keine Vorlagen sein können. Wenn sie nur die Template-Version hätten, würde der Compiler einen erzeugen, der nicht korrekt funktionieren würde.
Das gleiche gilt für die Zuweisung op ... denke ich.
Warum hat C ++ auto_ptr zwei Kopierkonstruktoren und zwei Zuweisungsoperatoren, aber einen Standardkonstruktor?
Tut es nicht.
Es hat einen Standardkonstruktor (einen Konstruktor, der 0 Argumente akzeptiert)
%Vor%Es gibt einen Kopierkonstruktor (einen Konstruktor, der eine Kopie von einem Objekt desselben Typs erstellt)
%Vor%Es gibt einen Zuweisungsoperator, mit dem Objekte des gleichen Typs zugewiesen werden können.
%Vor%Es hat einen schicken Vorlagenkonstruktor, der auto_ptr anderer Typen verwendet (das ist kein Kopierkonstruktor, es ist nur ein normaler Konstruktor (obwohl es eine Templatestruktur ist)).
%Vor%Es hat einen anderen Zuweisungsoperator, der verschiedene Typen von Auto-Pointer verwendet (also ja, das ist ein anderer Zuweisungsoperator, aber es ist kein Zuweisungsoperator (sondern ein Konvertierungszuweisungsoperator), da die rhs einen anderen Typ hat).
%Vor%