【问题标题】:Why is lvalue to rvalue reference binding allowed on g++ 4.4.6?为什么在 g++ 4.4.6 上允许左值到右值引用绑定?
【发布时间】:2015-07-14 02:01:30
【问题描述】:

我正在学习 C++11 的右值特性。 C++ Primer 5th edition 说右值引用只能绑定到右值,但是当我尝试编译这个程序时,它通过了,输出为1 1

我不明白为什么。我正在使用 g++ 4.4.6,并用

编译它

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;
}

【问题讨论】:

  • “右值引用不绑定到左值”规则是在 C++11 标准化过程的后期添加的。据推测,GCC 4.4.6 正在实施没有该禁令的规范的早期草案。
  • 可能是时候升级你的编译器了 :)

标签: c++ c++11 rvalue


【解决方案1】:

您的代码无效,左值不能像书中所说的那样绑定到右值引用。 g++5.1 rejects your code 带有错误信息

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

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

当前规则在N2844 中描述并在gcc 4.5 中实施。

【讨论】:

  • 作为记录,VS2013 和 VS2015 RC 也拒绝你的代码。
  • 你应该看看 4.4.0 的发布时间,也就是 2009 年 4 月。
  • N2118 包括这个例子:double&amp;&amp; rd4 = i; // OK, reference bound to temporary double
  • @o11c N2844 然后将其还原。
【解决方案2】:

GCC 4.4 系列在 April 2009 中首次发布,而在此之前的主干是 closed to all but regression and documentation fixes,即 2008 年 11 月。

防止右值引用绑定到左值的规则在 2008 年 12 月在论文 N2812 中首次提出后,于 2009 年 3 月作为论文 N2844 被投票纳入标准。

因此,新规则不可能在 GCC 4.4 中及时实施(实际上它是在 GCC 4.5 中实施的)。

【讨论】:

  • 所以当他们沿着给定的分支发布时,他们没有实现 DR?还是因为当时还没有 C++11 标准,所以 N2844 不被认为是 DR?
  • @Praetorian 据我所知,政策是只完成回归和文档修复。
猜你喜欢
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多