Ein VS2010 Bug? Erlauben verbindliche nicht-const Referenz auf Rvalue OHNE EINE Warnung?

8
%Vor%
  1. GCC ist der beste, um einen Kompilierungsfehler zu erhalten: ungültige Initialisierung von nichtkonstanten Referenzen vom Typ std::string& von einem temporären Typ std::string
  2. VS2008 ist nicht so schlecht, zumindest gibt es eine Warnung kompilieren : Warnung C4239: Nicht standardmäßige Erweiterung verwendet: 'initialisieren': Konvertierung von std::string nach std::string & A nicht-const Referenz darf nur an einen Lvalue
  3. gebunden sein
  4. Hier kommt der problematische - VS2010 (SP1) ist gut OHNE any Fehler oder Warnung, WARUM ?? !! Ich weiß, rvalue Referenz in VS2010 kann verwendet werden, um mit rvalue zu binden, aber ich verwende nicht && , stattdessen im Demo-Code, ich habe nur nicht-const lvalue Verweis!

Kann mir jemand helfen, das Verhalten von VS2010 hier zu erklären? Ist es ein Fehler? Danke

    
Gob00st 25.08.2011, 11:16
quelle

3 Antworten

11

Das ist ein bekanntes Problem / Merkmal der VS-Compiler. Sie haben das immer erlaubt und es scheint keinen Anstoß zu geben, diese Erweiterung zu entfernen .

    
David Rodríguez - dribeas 25.08.2011, 11:18
quelle
9

Der Compiler gibt eine Fehlermeldung mit deaktivierten Spracherweiterungen und einer Warnung bei / W4 aus. Durch das Entfernen dieses Codes wird jedoch der Code für die vorherige Kompilierung aufgehoben, und Microsoft tut dies nur ungern. Deshalb werden sie auch ihre SFINAE-Unterstützung nicht reparieren.

    
Puppy 25.08.2011 11:50
quelle
-1

Es gibt eine viel ärgerlichere Variante dieses Problems:

%Vor%

Also: zu was zeigt b.f während des Aufrufs von b.F() ? Das obige Beispiel, kompiliert mit VS2013 Standard-Debug-Einstellungen, läuft ohne abzustürzen und druckt 3 , aber ich würde vermuten, dass jedes viel komplexere Beispiel zu Stack-Korruption führen wird. Wenn dies nicht der Fall ist und der Compiler etwas "Cleveres" tut, um es zum Laufen zu bringen, dann denke ich, was es wirklich macht:

%Vor%     
Tom 11.08.2014 01:59
quelle