In C können Vorlagenparameter aus Funktionsparametern abgeleitet werden, was eine bequeme Typableitung ermöglicht. Diese Schlussfolgerung erstreckt sich jedoch nicht auf Klassenkonstruktoren.
Grund:
Das Fehlen einer Schlussfolgerung für Klassenkonstruktoren ergibt sich aus der Tatsache, dass ein Konstruktor nicht der einzige Einstiegspunkt für a ist Klasse. Kopierkonstruktoren und Zuweisungsoperatoren können Objekte auch bearbeiten, ohne über explizite Informationen zu den Vorlagenparametern zu verfügen.
Betrachten Sie das folgende Beispiel:
MyClass m(string s); MyClass *pm; *pm = m;
In diesem Szenario ist es für den Compiler schwierig, dies zu bestimmen der Vorlagenparameter für pm, da sowohl m als auch pm diese Informationen fehlen. Daher würde das Zulassen von Inferenz für Klassenkonstruktoren zu Unsicherheit und syntaktischen Schwierigkeiten führen.
Ausnahmen in C 17:
In C 17 wurde eine Ausnahme von dieser Regel eingeführt. Für bestimmte Typen wie std::pair und std::tuple können Vorlagenparameter aus Konstruktorargumenten abgeleitet werden.
Wenn Inferenz unerwünscht ist:
In einigen Fällen Inferenz Vorlagenparameter von Konstruktoren sind möglicherweise nicht wünschenswert. Stellen Sie sich eine Klasse vor, die Standardvorlagenparameter verwendet, die der Konstruktor möglicherweise nicht überschreibt. Wenn Inferenz zulässig wäre, könnte sie möglicherweise die Standardwerte überschreiben und zu unerwartetem Verhalten führen.
Während die Inferenz von Vorlagenparametern für Funktionsparameter den Code prägnanter macht, sorgt das Fehlen einer solchen Inferenz für Klassenkonstruktoren für Klarheit und verhindert Potenzial Unklarheiten im Klassengebrauch.
Das obige ist der detaillierte Inhalt vonWarum können C-Vorlagenparameter im Gegensatz zu Funktionen nicht von Klassenkonstruktoren abgeleitet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!