Standard Template Parameter - muss nicht von rechts sein? Warum funktioniert es?

8

Kann der Default-Template-Parameter "default value" so verwenden, dass er NICHT von rechts anfängt?

Was ist das Kriterium? Wie interpretiert der Compiler?

Zum Beispiel bin ich so überrascht, dass dieser Code funktioniert .

%Vor%

Siehe Live-Demo hier: Ссылка

    
javaLover 25.08.2016, 05:26
quelle

2 Antworten

8

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:

%Vor%

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).

%Vor%     
songyuanyao 25.08.2016, 05:41
quelle
4

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.

    
Martin Bonner 25.08.2016 05:38
quelle