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
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 vonF2
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.
Tags und Links c++ visual-studio c++11 c++14 copy-initialization