Die Vorlagendargumentableitung funktioniert hier gut, da die folgenden Vorlagenargumente für Funktionsschablonen durch Funktionsargumente abgeleitet werden können. In diesem Fall könnte das Template-Argument U
vom Funktionsargument u
abgeleitet werden. Beachten Sie, dass der nachfolgende template-Parameter nach einem Standard-Template-Argument für die Klassenvorlage entweder ein Standard-Template-Argument oder ein Template-Parameter-Pack haben muss.
$ 14.1 / 11 Template-Parameter [temp.param] :
Wenn ein Template-Parameter einer Klassenvorlage, Variablenvorlage oder Alias-Vorlage hat ein Standard-Template-Argument, jedes nachfolgende Template-Parameter soll entweder ein Standard Template-Argument haben geliefert oder ein Template-Parameterpaket sein. Wenn ein Template-Parameter von a primäre Klassenvorlage, primäre Variablenvorlage oder Aliasvorlage ist ein Template-Parameter-Pack, es soll der letzte Template-Parameter sein. Ein Template-Parameterpaket einer Funktionsvorlage darf nicht befolgt werden durch einen anderen Vorlagenparameter, es sei denn dieser Vorlagenparameter kann sein abgeleitet aus der Parametertypliste ([dcl.fct]) der Funktion Vorlage oder hat ein Standardargument ([temp.educt]). Eine Vorlage Parameter einer Deduktionsleitschablone ([temp.deduct.guide]), die hat kein Standardargument soll aus dem abgeleitet werden Parameter-Typ-Liste der Deduktionsleitschablone. [Beispiel:
%Vor%- Ende Beispiel]
Sie könnten versuchen, U
nicht reduzierbar zu machen und zu sehen, was passieren wird:
Beachten Sie, dass Sie alle Vorlagenargumente explizit angeben müssen, damit der Code funktioniert, wodurch Standardvorlagenargumente überhaupt bedeutungslos werden. Wenn Sie f()
oder f<true>()
arbeiten möchten, müssen Sie auch U
ein Standard-Template-Argument angeben (oder Template-Parameterpaket erstellen).
Sie können einen Standard für einen beliebigen Parameter angeben.
Wenn Sie als Standard verwenden möchten, können Sie nicht explizit Parameter rechts neben dem voreingestellten Parameter angeben. In Ihrem Beispiel wird U
jedoch vom Typ des Arguments für die Funktion abgeleitet, und T
wird standardmäßig verwendet.
Tags und Links c++ templates default-parameters