Deduktionsleitfaden und variadische Vorlagen

8

Betrachten Sie den folgenden Code:

%Vor%

Die fehlgeschlagene Zeile gibt den folgenden Fehler unter g ++ 7 zurück:

%Vor%

Ist das normal oder ist das ein Compiler Bug?

    
Vincent 02.06.2017, 23:09
quelle

1 Antwort

3

Dies ist gcc bug 80871 . Was folgt, ist eine Erklärung dafür, warum der Code wohlgeformt ist (und clng ist korrekt, wenn er entscheidet, dass t2 ein custom_tuple<int> ist).

Der Prozess, um herauszufinden, was mit

zu tun ist %Vor%

beinhaltet im Wesentlichen die Synthese einer Reihe von Funktionen und die Durchführung einer Überladungsauflösung für sie. Die relevanten Kandidaten sind die synthetisierten Funktionen aus dem einen Konstruktor und dem Deduktionsleitfaden:

%Vor%

Von diesem Punkt ausgehend wählen Sie Ihr eigenes Abenteuer basierend auf Ihrer Interpretation dessen, was ein "Trailing Parameter Pack" ist, nach [temp.arg.explicit] / 3 :

  

Ein nachfolgendes Template-Parameterpaket, das nicht anderweitig abgeleitet ist, wird auf eine leere Sequenz von Template-Argumenten zurückgeführt. Wenn alle Vorlagenargumente abgeleitet werden können, können sie alle weggelassen werden; In diesem Fall kann auch die leere Template-Argumentliste <> selbst weggelassen werden.

T... folgt nicht

Dieser Fall ist einfach. Wir haben nur einen brauchbaren Kandidaten (weil T... nicht ableitbar ist) - der Deduktionsleitkandidat. Wir leiten Args... als {int} ab, also enden wir mit custom_tuple<int> .

T... steht hinter

Sowohl gcc als auch clang betrachten die Deduktion als erfolgreich für den Konstruktor. Also gehen wir zu den Tiebreakern in [over.match.best] :

  

In Anbetracht dieser Definitionen wird eine funktionsfähige Funktion F1 als bessere Funktion definiert als eine andere funktionsfähige Funktion F2 if [...]

     
  • F1 und F2 sind Spezialisierungen für Funktionsvorlagen und die Funktionsvorlage für F1 ist spezialisierter als die Vorlage für F2 gemäß den in [temp.func.order] beschriebenen Teilordnungsregeln oder, falls nicht das,
  •   
  • F1 wird aus einem Deduktionsleitfaden ([over.match.class.educt]) erzeugt und F2 ist nicht oder, falls nicht, [...]
  •   

Für die Zwecke der Teilbestellung sind die relevanten Typen nur diejenigen, die entsprechen Funktionsparameter, und wir dürfen nicht verwendete Template-Parameter ignorieren, also auch keine Funktionsvorlage gilt als spezialisierter als die anderen.

Dies lässt uns einfach den Deduktionsführer bevorzugen, der der einfachste Schritt dieses ganzen Prozesses war. Wir leiten Args... als {int} ab, also enden wir mit custom_tuple<int> .

Wie auch immer, custom_tuple<int> ist die richtige Entscheidung.

    
Barry 03.06.2017, 01:43
quelle