Dieser Code funktioniert für clang 3.7, gcc 5.1 und vc ++ 14.2.
2 Probleme,
1. Warum kann Vorlage den Typ A :: B ableiten? (So schlau!)
Soweit ich weiß, leiten Sie den Typ durch eine Rückgabeanweisung anstelle eines Parameters ab.
Aber ich habe etwas gefunden, das an N4606 interessiert ist. 12.3.2 6 A conversion function template shall not have a deduced return type (7.1.7.4).
(Ich kann jedoch keine weiteren Informationen dazu finden, weil 7.1.7.4 zu schwer zu verstehen ist.)
2. Warum könnte der Vorlagenzugriff für die Konvertierung A :: B?
Danke.
- Warum kann die Vorlage den Typ A :: B ableiten? (So schlau!)
Da test()
eine A::B
benötigt, müssen Sie eine C
in eine A::B
konvertieren. Wir können eine Initialisierung durch die Konvertierungsfunktion versuchen, für die wir in [over.match.conv]:
Die Konvertierungsfunktionen von
S
und seinen Basisklassen werden berücksichtigt. Diese nicht explizite Konvertierung Funktionen, die nicht inS
und Yield-TypT
oder einem Typ, der in den TypT
via konvertiert werden kann, ausgeblendet sind Eine Standardkonvertierungssequenz (13.3.3.1.1) sind Kandidatenfunktionen.
Wir führen einen Vorlagenabzug nach [temp.conv]:
durchDie Vorlageargumentabrechnung erfolgt durch Vergleich des Rückgabetyps der Umwandlungsfunktionsvorlage (Aufruf es P) mit dem Typ, der als Ergebnis der Umwandlung erforderlich ist (nennen Sie es A; siehe 8.6, 13.3.1.5 und 13.3.1.6 für die Bestimmung dieses Typs) wie in 14.8.2.5 beschrieben.
Grundsätzlich leiten wir die T
in template <class T> operator T()
zu A::B
ab. Dies ist eine wohlgeformte Umwandlungssequenz und die einzige praktikable, also was passiert.
Die von Ihnen zitierte Zeile "Abgeleiteter Rückgabetyp" bezieht sich auf auto
oder decltype
im Rückgabetyp. Das passiert hier nicht.
- Warum könnte der Konvertierungsfunktionsvorlagenzugriff A :: B?
Zugriffsregeln beziehen sich ausschließlich auf Namen. Der Name B
und nur der Name ist für A
privat. Aber wir greifen nicht auf den Namen zu, wir leiten den Typ direkt her.
B
ist public, also ist auch der Körper der Konvertierungsfunktion wohlgeformt, also ist alles über den Code wohlgeformt.
Um die Dinge etwas zu vereinfachen:
Wenn Sie eine innere Klasse oder eine Funktion nur als privat definieren, bedeutet dies, dass der Name der Klasse oder einer Funktion nur von der Klasse verwendet werden kann und andernfalls nicht. Sie können keinen Code schreiben, der den Namen der privaten Klasse oder einer Funktion außerhalb der Klasse verwendet.
Im gezeigten Code wird A::B
nicht irgendwo außerhalb der Klasse verwendet.
Das funktioniert auch, aus dem gleichen Grund:
%Vor% auto
funktioniert. A::B
funktioniert nicht.
Tags und Links c++ type-conversion templates implicit-conversion