clang ++ schlägt fehl, aber g ++ ist erfolgreich bei der Verwendung einer Umwandlung in einen Operator vom Typ const-unrelated-type in einer Zuweisung

8

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 :

%Vor%

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.

    
decltype_auto 12.11.2015, 13:58
quelle

1 Antwort

8

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 .

    
Shafik Yaghmour 12.11.2015, 15:00
quelle