Heim > Artikel > Backend-Entwicklung > Warum können Vorlagentypparameter nicht aus Standardfunktionsargumenten in C abgeleitet werden?
Warum Vorlagentypparameter nicht von Standardfunktionsargumenten abgeleitet werden können
In C besteht ein häufiges Missverständnis darin, dass der Compiler Vorlagentypparameter ableiten kann aus Standardfunktionsargumenten. Dies ist jedoch nicht der Fall.
Wenn der folgende Code auftritt:
<code class="cpp">struct foo { template <typename T> void bar(int a, T b = 0.0f) { } }; int main() { foo a; a.bar(5); // Error: could not deduce template argument for T }</code>
Der Compiler kann den Typ T nicht aus dem Standardargument 0.0f ableiten. Stattdessen ist eine explizite Spezifikation erforderlich, wie in a.bar
C 03-Verbot
In C 03 verbietet die Sprachspezifikation ausdrücklich die Verwendung Standardfunktionsargumente für den Abzug von Vorlagenargumenten (C 03 §14.8.2/17):
A template type-parameter cannot be deduced from the type of a function default argument.
C 11 Standardvorlagenargumente
In C 11 eine Problemumgehung entstand: Einführung von Standardvorlagenargumenten. Durch Ändern des Codes wie folgt:
<code class="cpp">template <typename T = float> void bar(int a, T b = 0.0f) { }</code>
Der Standardvorlagenparameter T wird bereitgestellt. Es ist jedoch zu beachten, dass das Vorhandensein eines Standardvorlagenarguments die Einschränkung auf Standardfunktionsargumente nicht aufhebt.
Gemäß C 11 14.8.2.5/5 werden Standardfunktionsargumente in als „nicht abgeleitete Kontexte“ betrachtet der Prozess zur Ableitung von Vorlagenargumenten. Dies bedeutet, dass der Compiler den Standardwert aus dem Funktionsargument nicht verwenden kann, um auf den Vorlagentypparameter zu schließen.
Fazit
Während Standardfunktionsargumente Komfort bieten, sind Vorlagentypparameter hilfreich sollte daraus nicht abgeleitet werden. Für Fälle, in denen Standardwerte erforderlich sind, bieten Standardvorlagenargumente eine tragbarere und flexiblere Lösung.
Das obige ist der detaillierte Inhalt vonWarum können Vorlagentypparameter nicht aus Standardfunktionsargumenten in C abgeleitet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!