2015-07-14 29 views
7

Uczę się funkcji rvalue w C++ 11. C++ Primer 5. edycja mówi, że referencja rvalue może tylko wiązać się z wartością r, ale kiedy próbowałem skompilować ten program, to minął, a wyjście to 1 1.Dlaczego dopuszczalne jest odniesienie do wartości r lawue w g ++ 4.4.6?

Nie rozumiem dlaczego. Używam g ++ 4.4.6 i skompilowane go z

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

Reguła "wartość r zwrotna nie wiąże się z wartościami l" została dodana dość późno w procesie standaryzacji C++ 11. Przypuszczalnie GCC 4.4.6 wdraża wcześniejszy projekt specyfikacji, który nie ma tego zakazu. –

+0

Prawdopodobnie czas na aktualizację kompilatora :) –

Odpowiedz

6

Twój kod jest nieprawidłowy, lvalue nie może powiązać z wartością rvalue, tak jak mówi książka. g++5.1 rejects your code z komunikatem o błędzie

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

g ++ 4.4.6 był released w kwietniu 2011 roku, niespełna miesiąc po ostatnim projektem dla C++ 11 było approved. Obserwowane zachowanie jest albo błędem gcc, albo zachowaniem określonym przez starą wersję roboczą standardu C++ 11.

Obecna zasada jest opisana w N2844 i zaimplementowana w gcc 4.5.

+0

Dla rekordu, VS2013 i VS2015 RC również odrzuca twój kod. –

+1

Powinieneś prawdopodobnie spojrzeć na czas wydania wersji 4.4.0, który był w kwietniu 2009. –

+0

[N2118] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118 .html) zawiera ten przykład: 'double && rd4 = i; // OK, odwołanie związane z tymczasowym podwójnym ' – o11c

6

Seria GCC 4.4 została wydana w April 2009 i tułów był closed to all but regression and documentation fixes dobrze wcześniej, w listopadzie 2008 roku

Zasadą, która uniemożliwia odniesienie rvalue od wiązania się lwartościami został wybrany do normy w marcu 2009 roku, jako artykuł N2844, po pierwszym sugerowaniu w grudniu 2008 r., w pracy N2812.

W ten sposób nowa reguła nie mogłaby zostać wdrożona w czasie dla GCC 4.4 (w rzeczywistości została zaimplementowana dla GCC 4.5).

+0

Czy więc, kiedy wydadzą wydawnictwa w danej branży, nie wdrożą DR? Czy też N2844 nie jest uważany za DR, ponieważ nie było wtedy standardu C++ 11? – Praetorian

+0

@Praetorian Z tego, co wiem, obowiązują tylko poprawki regresji i dokumentacji. –