C ++ - Konvertierung Funktion Vorlage Abzug, warum funktioniert das?

8
%Vor%

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.

    
Caesar 23.09.2016, 10:53
quelle

2 Antworten

4
  
  1. Warum kann die Vorlage den Typ A :: B ableiten? (So ​​schlau!)
  2.   

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]:

haben
  

Die Konvertierungsfunktionen von S und seinen Basisklassen werden berücksichtigt. Diese nicht explizite Konvertierung   Funktionen, die nicht in S und Yield-Typ T oder einem Typ, der in den Typ T via konvertiert werden kann, ausgeblendet sind   Eine Standardkonvertierungssequenz (13.3.3.1.1) sind Kandidatenfunktionen.

Wir führen einen Vorlagenabzug nach [temp.conv]:

durch
  

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

  
  1. Warum könnte der Konvertierungsfunktionsvorlagenzugriff A :: B?
  2.   

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.

Der Konstruktor von

B ist public, also ist auch der Körper der Konvertierungsfunktion wohlgeformt, also ist alles über den Code wohlgeformt.

    
Barry 23.09.2016, 11:05
quelle
0

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.

    
Sam Varshavchik 23.09.2016 11:06
quelle