Nehmen Sie die folgendenzwingt templatized Konstruktor über Compiler erzeugte Kopie-Konstruktor
template<class T>
struct Foo {
Foo(){}
// a template constructor "generalized" over related types
template<class U>
Foo(Foo<U> const&) {
std::cout << 1;
}
// copy constructor
Foo(Foo const&) {
std::cout << 2;
}
};
und seine Benutzer:
void main() {
Foo<int> f1;
Foo<const int> f2(f1); // prints 1
Foo<const int> f3(f2); // prints 2
}
Auch ohne die explizite Copykonstruktor, Compiler generiert ein und verwendet diese für f3(f2)
.
Gibt es eine Möglichkeit, die Überladung der Vorlage zu erzwingen? Zum Beispiel, kann der Copy-Konstruktor SFINAE'd out sein? Dies geschieht, um eine Code-Duplizierung zu vermeiden, da es interessanterweise scheinbar keine Möglichkeit gibt, delegierende Konstruktoren zu verwenden (Delegieren vom Kopierkonstruktor an die Vorlage).
Nein, ist, dass nicht die gleiche, und es macht 'f3 (f2)' einen Fehler, da die Überladungsauflösung noch den Copykonstruktor und Fehler, wie 'delete'd nimmt. (Kommentar Ich antwortete fragte, ob 'löschen 'ist eine Option) – sly