Hier ist ein kurzes Beispiel, das diese reproduziert "Keine brauchbare Konvertierung" mit Zitrone für Clang, aber gültig für g ++ Unterschied im Compiler-Verhalten.
%Vor%live bei godbolts
g ++ (4.9, 5.2) kompiliert das still; während clang ++ (3.5, 3.7) kompiliert es
wenn
%Vor%oder
%Vor%werden verwendet, aber nicht mit dem Standardwert
%Vor% In diesem Fall macht clang ++ (3.5) a = b
:
Mit Bezug auf den 2011¹-Standard: Hat clang ++ Recht, den ausgefallenen Code abzulehnen oder hat g ++ recht, wenn er diesen akzeptiert?
Nota bene : Das ist nicht eine Frage darüber, ob der const
Qualifier auf cast_type
sinnvoll ist. Hier geht es darum, welcher Compiler standardkonform arbeitet und nur darüber .
¹ 2014 sollte hier keinen Unterschied machen.
BEARBEITEN:
Bitte unterlassen Sie die erneute Markierung mit dem generischen C ++ - Tag.
Ich möchte zuerst wissen, welches Verhalten dem 2011 Standard entspricht, und die Commitments not to break existing (< 2011) code
aus dem Satz vorerst behalten.
Es sieht also so aus, als ob das von diesem Bericht über den Clang-Bug abgedeckt wird rvalue overload blendet den Const lvalue aus? mit folgendem Beispiel:
%Vor%was mit demselben Fehler wie der OP-Code fehlschlägt. Richard Smith gegen Ende sagt:
Update: Wir wählen "f (A & amp; & amp;)" korrekt, aber wir lehnen es falsch ab die Initialisierung des Parameters. Weiter reduziert:
%Vor%Hier gilt [dcl.init.ref] p5 bullet 2 bullet 1 bullet 2 nicht, weil [over.match.ref] p1 keine Konvertierungsfunktionen findet, weil "A" nicht referenzenkompatibel zu "const A" ist. Also fallen wir in [dcl.init.ref] p5 bullet 2 bullet 2 kopieren und a initialisieren Temporär vom Typ A von 'b', und binden Sie den Verweis darauf. Ich bin nicht Sicher, wo in diesem Prozess wir falsch gehen.
Aber kommt dann mit einem anderen Kommentar zurück wegen eines Fehlerbericht 1604 :
DR1604 hat die Regeln so geändert, dass
%Vor%ist jetzt schlecht geformt. Also sind wir jetzt richtig, um die Initialisierung zu verwerfen. Aber das ist immer noch eine schreckliche Antwort; Ich habe CWG erneut angestupst. Wir sollten verwerfen Sie wahrscheinlich f (A & amp; & amp;;) während der Überladungsauflösung.
Es scheint also so, als würde clang technisch das Richtige tun, basierend auf der Standardsprache heute, aber es könnte sich ändern, da zumindest aus dem Clan-Team Uneinigkeit darüber zu bestehen scheint, dass dies das richtige Ergebnis ist. Vermutlich wird dies zu einem Defektbericht führen und wir werden warten müssen, bis es gelöst ist, bevor wir zu einem endgültigen Schluss kommen können.
Aktualisieren
Sieht so aus, als ob Fehlerbericht 2077 aufgrund dieses Problems eingereicht wurde .
Tags und Links c++11 language-lawyer g++ clang++ conversion-operator