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 FunktionF2
if [...]
F1
undF2
sind Spezialisierungen für Funktionsvorlagen und die Funktionsvorlage fürF1
ist spezialisierter als die Vorlage fürF2
gemäß den in [temp.func.order] beschriebenen Teilordnungsregeln oder, falls nicht das,F1
wird aus einem Deduktionsleitfaden ([over.match.class.educt]) erzeugt undF2
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.
Tags und Links c++ g++ tuples c++17 deduction-guide