2015-07-14 11 views
7

Ich lerne Rvalue-Funktion von C++ 11. C++ Primer 5. Ausgabe besagt, dass eine Rvalue-Referenz nur an einen Rvalue binden kann, aber als ich dieses Programm zu kompilieren versuchte, übergab es, und die Ausgabe ist 1 1.Warum ist die lvalue to rvalue Referenzbindung in g ++ 4.4.6 erlaubt?

Ich verstehe nicht warum. Ich bin mit g ++ 4.4.6 und kompiliert es mit

g ++ -Wall -std = C++ 0x test.cpp -o Test

#include <iostream> 

using namespace std; 

int main() 
{ 
    int i = 0; 
    int &&rr = i; 

    rr = 1; 
    std::cout << rr << std::endl; 
    std::cout << i << std::endl; 

    return 0; 
} 
+0

Die Regel "rvalue reference bindet nicht an lvalues" wurde erst relativ spät in den C++ 11-Standardisierungsprozess eingefügt. Vermutlich implementiert GCC 4.4.6 einen früheren Entwurf der Spezifikation, der dieses Verbot nicht hat. –

+0

Wahrscheinlich Zeit, um Ihren Compiler zu aktualisieren :) –

Antwort

6

Ihr Code ungültig ist, ein Lvalue kann nicht genau wie im Buch angegeben an eine rvalue-Referenz gebunden werden. g++5.1 rejects your code mit der Fehlermeldung

main.cpp:8:16: error: cannot bind 'int' lvalue to 'int&&' 
    int &&rr = i; 
       ^

g ++ 4.4.6 war released im April 2011, weniger als ein Monat nach dem endgültigen Entwurf für 11 C++ war approved. Das Verhalten, das Sie sehen, ist entweder ein gcc-Fehler oder das Verhalten, das durch einen frühen Entwurf des C++ 11-Standards festgelegt wurde. Die aktuelle Regel wird in N2844 beschrieben und in gcc 4.5 implementiert.

+0

Für den Rekord, VS2013 und VS2015 RC lehnt auch Ihren Code ebenso ab. –

+1

Sie sollten sich wahrscheinlich die Veröffentlichungszeit von 4.4.0 ansehen, die im April 2009 war. –

+0

[N2118] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118 .html) enthält dieses Beispiel: 'double && rd4 = i; // OK, Referenz an temporäres double gebunden – o11c

6

Die Serie GCC 4.4 wurde zum ersten Mal in April 2009, und die Stamm war closed to all but regression and documentation fixes vor, dass 2008

im November gut freigegeben

Die Regel, dass März 2009 rvalue Referenzen aus der Bindung an L-Wert wurde in den Standard gestimmt verhindert, wie das Papier N2844, nachdem es im Dezember 2008 erstmals in der Veröffentlichung N2812 vorgeschlagen wurde.

Somit konnte die neue Regel möglicherweise nicht rechtzeitig für GCC 4.4 implementiert werden (sie wurde tatsächlich für GCC 4.5 implementiert).

+0

Also, wenn sie Releases entlang einer bestimmten Branche machen, implementieren sie keine DRs? Oder ist es, dass N2844 nicht als DR gilt, da es zu der Zeit noch keinen C++ 11-Standard gab? – Praetorian

+0

@Praetorian Soweit ich weiß, ist die Richtlinie, dass nur Regression und Dokumentation behoben werden. –

Verwandte Themen