Die Adresse einer überladenen Funktionsvorlage ist manchmal möglich

8

Ein gcc 4.9.0 :

%Vor%

Gibt es Anhaltspunkte dafür, warum die Adresse im zweiten Fall verwendet werden kann?

    
gd1 13.07.2015, 19:40
quelle

1 Antwort

3

Der Abzug für auto ist der gleiche wie der Abzug für die Vorlage. Aus [dcl.spec.auto]:

  

Wenn eine mit einem Platzhaltertyp deklarierte Variable initialisiert wird, [...] ist der abgeleitete Rückgabetyp oder Variablentyp   bestimmt von der Art seines Initialisierers. Wenn der Platzhalter der automatische Typbezeichner ist,   Der abgeleitete Typ wird anhand der Regeln für die Ableitung von Vorlagenargumenten ermittelt. Wenn der Platzhalter der auto Typspezifizierer ist,   Der abgeleitete Typ wird anhand der Regeln für die Ableitung von Vorlagenargumenten ermittelt.

Wenn wir also entweder:

%Vor%

Wir führen Typabzug so aus, als ob wir (um T.C.s Wortwahl zu entlehnen) angerufen haben:

%Vor%

und den abgeleiteten Typ M als Typ von f bzw. b verwenden.

Aber, nach [temp.educt.type], meine Betonung:

  

Wenn ein Template-Parameter nur in nicht-abgeleiteten verwendet wird   Kontexte und ist nicht explizit angegeben, Schablonenargumentabzug schlägt fehl.

     

Die nicht abgeleiteten Kontexte sind:
  - [...]
  - Ein Funktionsparameter, für den die Argumentableitung aufgrund der zugehörigen Funktion nicht möglich ist   Argument ist eine Funktion oder eine Menge überladener Funktionen (13.4), und eine oder mehrere der folgenden Aussagen treffen zu:
  - mehr als eine Funktion entspricht dem Funktionsparameter-Typ (was zu einem mehrdeutigen Abzug führt) ,   oder
  - Keine Funktion entspricht dem Funktionsparametertyp oder dem Typ   - Die Menge der als Argument übergebenen Funktionen enthält eine oder mehrere Funktionsvorlagen.
  - [...]

In beiden Fällen ist das Argument eine Menge überladener Funktionen, die eine oder mehrere Funktionsschablonen enthält. Dies macht es zu einem nicht abgeleiteten Kontext, so dass die Schablonenargumentableitung fehlschlägt. Somit ist clang korrekt, wenn es beide Initialisierungen ablehnt.

    
Barry 13.07.2015 19:55
quelle