Referenzbindung durch mehrdeutigen Konvertierungsoperator

8
%Vor%

Sowohl clang als auch gcc geben einen mehrdeutigen Konvertierungsoperator, aber Visual Studio kompiliert ok und gibt "operator const CL2 & amp;" aus. Wie muss die Norm stimmen? Wie ich erkannt habe, wird die Umwandlung von CL1 in const CL2 & amp; befindet sich im Kopierinitialisierungskontext (als Teil einer direkten Initialisierung des cl2-Objekts). Ich habe n4296 Entwurf gesehen, [over.match.copy]:

  

Angenommen, dass "cv1 T" der Typ des Objekts ist, das initialisiert wird,   Mit T ein Klassentyp werden die Kandidatenfunktionen wie folgt ausgewählt:
  - Die Konvertierungskonstruktoren (12.3.1) von T sind Kandidaten   Funktionen.
  - Wenn der Typ des Initialisierungsausdrucks a ist   Klassentyp "cv S", die nicht-expliziten Konvertierungsfunktionen von S und seine   Basisklassen werden berücksichtigt. Bei der Initialisierung eines temporären zu binden   zum ersten Parameter eines Konstruktors, dessen Parameter vom Typ ist   "Referenz auf möglicherweise cv-qualifiziertes T" und der Konstruktor wird aufgerufen   mit einem einzigen Argument im Kontext der direkten Initialisierung eines   Objekt vom Typ "cv2 T", explizite Konvertierungsfunktionen sind auch   berücksichtigt. Diejenigen, die nicht in S versteckt sind und einen Typ ergeben, dessen   cv-unqualifizierte Version ist derselbe Typ wie T oder ist eine abgeleitete Klasse   davon sind Kandidatenfunktionen. Konvertierungsfunktionen, die zurückgeben   "Verweis auf X" gibt lvales oder xvalues ​​zurück, abhängig vom Typ von   Referenz, vom Typ X und werden daher als X angesehen   Prozess der Auswahl von Kandidatenfunktionen.

i.e. beide Konvertierungsoperatoren werden als Return CL2 und Const CL2 betrachtet (nicht nur CL2 ohne const) und es bleibt zu lösen, welche Konvertierung besser ist: CL2 - & gt; const CL2 & amp; oder const CL2 - & gt; const CL2 & amp ;. Der zweite Fall scheint angemessener. Sollte in diesem Zusammenhang eine bessere Qualifizierung berücksichtigt werden? Oder beide Fälle sind Identitätskonvertierung? Ich konnte es nicht in Standard finden

    
user3514538 06.12.2015, 16:35
quelle

1 Antwort

4

Da beide Konvertierungsoperatoren identische Signaturen haben, ist die einzige Möglichkeit, gegenüber der anderen vorzuziehen, die Anwendung von [over.match.best] / (1.4) ...

  

- der Kontext ist eine Initialisierung durch benutzerdefinierte Konvertierung (siehe 8.5,   13.3.1.5 und 13.3.1.6) und die Standardkonvertierungssequenz vom Rückgabetyp F1 zum Zieltyp (d. H. Der Typ des   Entität wird initialisiert) ist eine bessere Konvertierungssequenz als die   Standardkonvertierungssequenz vom Rückgabetyp von F2 zum   Zieltyp.

... oder (1.5):

  

- der Kontext ist eine Initialisierung durch Konvertierungsfunktion für direkt   Referenzbindung (13.3.1.6) eines Verweises auf den Funktionstyp, [...]

Offensichtlich gilt beides nicht, daher die Mehrdeutigkeit. Ein möglicher Weg zur Disambiguation:

%Vor%

Demo ; Hier ist die anfängliche Standardkonvertierungssequenz des impliziten Objektarguments der früheren Überladung gemäß [over.ics.rank] / (3.2.6) besser, was durch [over.match.best] / (1.3) entscheidend ist.

    
Columbo 06.12.2015, 18:03
quelle