Die Sprache C ermöglicht die Ableitung von Vorlagenparametern aus Funktionsparametern, jedoch nicht aus Klassenkonstruktoren. Dies kann die Frage aufwerfen: Warum diesen Rückschluss nicht für Konstruktoren zulassen?
Ein Grund dafür, dass Vorlagenrückschluss für Konstruktoren nicht zulässig ist, besteht darin, dass Konstruktoren nicht der einzige Einstiegspunkt für eine Klasse sind. Kopierkonstruktoren und Zuweisungsoperatoren bieten zusätzliche Möglichkeiten zum Erstellen von Objekten einer Klasse. Das Zulassen von Vorlagenrückschlüssen für Konstruktoren würde erfordern, dass der Compiler alle diese Einstiegspunkte bei der Bestimmung der Vorlagenparameter berücksichtigt, was zu syntaktischer Mehrdeutigkeit führen könnte.
class MyClass { int a; int b; public: MyClass(int a, int b): a(a), b(b) {} };
Wenn in diesem Beispiel Vorlagenrückschlüsse für Konstruktoren zulässig wären, Es wäre unklar, welche Vorlagenparameter verwendet werden sollten, wenn ein MyClass-Objekt mit dem Kopierkonstruktor oder dem Zuweisungsoperator erstellt wird.
Ein weiterer Grund dafür, dass Vorlagenrückschlüsse für Konstruktoren nicht zulässig sind ist, dass es zu unerwartetem Verhalten führen könnte. Betrachten Sie den folgenden Code:
class MyContainer { std::vector<T> vec; }; int main() { MyContainer<int> container; // explicitly specify template parameter MyContainer container2(vec); // infer template parameter from constructor }
In diesem Beispiel kann die MyContainer-Klasse entweder mit einem explizit angegebenen Vorlagenparameter oder einem Vektor eines bestimmten Typs erstellt werden. Wenn Vorlagenrückschlüsse für Konstruktoren zulässig wären, würde die zweite Codezeile einen MyContainer vom Typ T erstellen. Dies ist jedoch möglicherweise nicht das beabsichtigte Verhalten, da der Benutzer möglicherweise einen MyContainer vom Typ int erstellen wollte.
Aufgrund dieser Bedenken ist die Vorlageninferenz für Klassenkonstruktoren nicht zulässig. In C 17 kann jedoch eine teilweise Template-Spezialisierung verwendet werden, um einen ähnlichen Effekt zu erzielen. Durch die teilweise Vorlagenspezialisierung kann der Benutzer Vorlagenparameter für einen bestimmten Typ angeben, während andere Vorlagenparameter abgeleitet werden können.
template <typename T> class MyContainer { std::vector<T> vec; }; template <> class MyContainer<int> { std::vector<int> vec; }; int main() { MyContainer container; // infer template parameter to 'int' MyContainer<double> container2; // explicitly specify template parameter }
In diesem Beispiel verfügt die MyContainer-Klasse über eine teilweise Vorlagenspezialisierung für int. Dies bedeutet, dass beim Erstellen eines MyContainer mit einem int-Typ automatisch abgeleitet wird, dass der Vorlagenparameter int ist. Für andere Typen muss der Template-Parameter explizit angegeben werden.
Das obige ist der detaillierte Inhalt vonWarum erlaubt C keine Template-Parameter-Inferenz für Konstruktoren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!