Kontroverse um Klassenkonstruktor-Vorlageninferenzen
Vorlagenparameter können bequem aus Funktionsargumenten abgeleitet werden, wie im folgenden Code:
template <typename T> void swap(T& a, T& b) { T temp = a; a = b; b = temp; }
Ein ähnlicher Ansatz ist jedoch für Klassenkonstruktoren nicht zulässig, was bei C-Programmierern Fragen aufgeworfen hat. Warum nicht?
Der Grund für diese Inkonsistenz liegt in der Komplexität der Objektkonstruktion. Konstruktoren sind nicht der einzige Einstiegspunkt für eine Klasse. Kopierkonstruktoren und Zuweisungsoperatoren spielen ebenfalls eine wichtige Rolle, und das Ableiten von Vorlagenparametern nur vom Konstruktor könnte zu Mehrdeutigkeiten führen.
Betrachten Sie das folgende Beispiel:
template <typename T> class Variable { T data; public: Variable(T d) { data = d; } };
Wenn die Vorlageninferenz zulässig wäre, würde die Folgender Code wäre gültig:
Variable var(2); // Equivalent to Variable<int> var(2);
Aber was wäre, wenn wir die Kopierkonstruktion oder Zuweisung verwenden würden Operatoren?
MyClass m(string s); MyClass *pm; *pm = m;
In diesem Fall wäre es für den Compiler schwierig, den Vorlagentyp von MyClass pm zu bestimmen.
Um dieses Problem zu beheben, führte C 17 die Typableitung aus Konstruktorargumenten ein . Dadurch können Vorlagenparameter aus Konstruktorparametern abgeleitet werden, sodass in bestimmten Situationen keine expliziten Typargumente erforderlich sind. Zum Beispiel:
std::pair p(2, 4.5); // Inferred as std::pair<int, double> p(2, 4.5); std::tuple t(4, 3, 2.5); // Inferred as std::tuple<int, int, double> t(4, 3, 2.5);
Es ist wichtig zu beachten, dass sich diese Inferenzfunktion noch in der Entwicklung befindet und möglicherweise Änderungen in zukünftigen C-Standards unterliegt. Dennoch stellt es einen bedeutenden Schritt zur Vereinfachung des Codes und zur Verbesserung der Typensicherheit dar.
Das obige ist der detaillierte Inhalt vonWarum können C-Vorlagenparameter nicht für Klassenkonstruktoren wie Funktionsvorlagen abgeleitet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!