C++ 为什么g++;4.4.6?

C++ 为什么g++;4.4.6?,c++,c++11,rvalue,C++,C++11,Rvalue,我正在学习C++11的右值特性。C++入门第五版说,一个rValk引用只能绑定到一个rValm,但是当我尝试编译这个程序时,它通过了,输出是代码> 1 1 我不明白为什么。我使用的是g++4.4.6,并用 g++-Wall-std=c++0x test.cpp-o test #包括 使用名称空间std; int main() { int i=0; int&&rr=i; rr=1; std::cout您的代码无效,左值不能像书中所说的那样绑定到右值引用。错误消息如下 g++4.4.6发布于201

我正在学习C++11的右值特性。C++入门第五版说,一个rValk引用只能绑定到一个rValm,但是当我尝试编译这个程序时,它通过了,输出是代码> 1 1 我不明白为什么。我使用的是g++4.4.6,并用

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

#包括
使用名称空间std;
int main()
{
int i=0;
int&&rr=i;
rr=1;

std::cout您的代码无效,左值不能像书中所说的那样绑定到右值引用。错误消息如下

g++4.4.6发布于2011年4月,距离C++11最终草案发布不到一个月。您看到的行为要么是gcc错误,要么是C++11标准早期工作草案中指定的行为


当前规则在中进行了描述并在中实现。

GCC4.4系列于年首次发布,而主干早在2008年11月就发布了

该文件在2008年12月首次提出后,于2009年3月将防止右值引用与左值绑定的规则投票纳入该标准


因此,新规则不可能在GCC4.4中及时实施(实际上是在GCC4.5中实施的)。

右值引用不绑定左值规则是在C++11标准化过程中很晚才添加的。大概GCC 4.4.6正在实现一个没有该禁令的早期规范草案。可能是时候升级您的编译器了:)作为记录,VS2013和VS2015 RC也会拒绝您的代码。您可能应该看看4.4.0的发布时间,它是2009年4月。包括以下示例:
double&&rd4=i;//好的,绑定到临时double的引用
@o11c然后恢复了该引用。因此,当他们沿着给定分支发布时,他们不实现DRs?还是N2844不被视为DR,因为当时没有C++11标准?据我所知,该策略是只进行回归和文档修复。
#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;
}
 main.cpp:8:16: error: cannot bind 'int' lvalue to 'int&&'
     int &&rr = i;
                ^