2015-07-14 4 views
7

J'apprends la fonctionnalité rvalue de C++ 11. C++ Primer 5ème édition dit qu'une référence rvalue peut seulement se lier à un rvalue, mais quand j'ai essayé de compiler ce programme, il est passé, et la sortie est 1 1.Pourquoi la liaison de référence de lvalue à rvalue est-elle autorisée sur g ++ 4.4.6?

Je ne comprends pas pourquoi. J'utilise g ++ 4.4.6, et compilé avec

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

#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

La règle "La référence rvalue ne lie pas à lvalues" a été ajoutée assez tard dans le processus de normalisation C++ 11. Vraisemblablement, GCC 4.4.6 met en œuvre une version antérieure de la spécification qui n'a pas cette interdiction. –

+0

Probablement le temps de mettre à jour votre compilateur :) –

Répondre

6

Votre code est invalide, un Lvalue ne peut pas se lier à une référence comme le livre le dit. g++5.1 rejects your code avec le message d'erreur

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

g ++ 4.4.6 est released en Avril 2011, moins d'un mois après que le projet final de 11 C++ était approved. Le comportement que vous voyez est soit un bogue gcc, soit le comportement spécifié par un premier brouillon de la norme C++ 11.

La règle actuelle est décrite dans N2844 et implémentée dans gcc 4.5.

+0

Pour l'enregistrement, VS2013 et VS2015 RC rejette également votre code. –

+1

Vous devriez probablement regarder l'heure de sortie de 4.4.0, qui était en avril 2009. –

+0

[N2118] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118 .html) inclut cet exemple: 'double && rd4 = i; // OK, référence liée au double temporaire – o11c

6

La série GCC 4.4 a été d'abord publié en April 2009, et le tronc était bien closed to all but regression and documentation fixes avant que, en Novembre 2008.

La règle qui empêche les références rvalue de se lier à lvalues ​​a été voté dans la norme en Mars 2009, comme le document N2844, après avoir été suggéré en décembre 2008, dans l'article N2812.

Ainsi, la nouvelle règle ne pouvait pas être implémentée à temps pour GCC 4.4 (elle était en fait implémentée pour GCC 4.5).

+0

Donc, quand ils font des versions le long d'une branche donnée, ils n'implémentent pas de DR? Ou est-ce que N2844 n'est pas considéré comme un DR puisqu'il n'y avait pas de norme C++ 11 à ce moment-là? – Praetorian

+0

@Praetorian Autant que je sache, la politique est que seules les corrections de régression et de documentation sont faites. –