【问题标题】:Binding rvalue to const lvalue reference将右值绑定到 const 左值引用
【发布时间】:2017-04-13 21:34:18
【问题描述】:

由于某种原因,我没能找到这个确切的问题。为什么允许将rvalue 绑定到const lvalue reference,尽管没有const 是不可能的?

我确实理解右值的生命周期以某种方式获得了扩展(在第一种情况下),但如果是这样,为什么编译器不允许更改那个“右值”,它不再是一个真正的临时对象了。

例如,考虑以下代码:

int main(){
   int &i=3; //produces error
   const int&j =3; //compiles
   return 1;
}

【问题讨论】:

  • 问题毫无意义。 rvalues 无法绑定。只有引用可以绑定到任何东西。
  • @SergeyA 你知道提问者的意思。您可以进行修改以改进。

标签: c++ constants lvalue rvalue


【解决方案1】:

您可能会发现以下文章很有用:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1993/N0345.pdf

我在这里可能完全错了,但这就是我合理化它的方式。右值是常量,不能更改。你不能改变整数 5,事实上。因此,当您绑定引用时,左值必须是 const。否则你的编译器会报错:

obj & a1 = bar();

invalid initialization of non-const reference of type ‘obj&’ from an rvalue of type ‘obj’

使用 g++

安全地将右值绑定到左值的唯一方法是将左值标记为 const,或者使用可变右值引用 &&(相信在 C++11 中引入?)

struct obj {
};

obj bar() {
    obj x;
    return x;
}

int main() {
const obj & a1 = bar();
obj && a2 = bar();
return 0;
};

【讨论】:

  • 我理解你的思维方式,但是在将右值绑定到左值之后,你实际上给它起了一个名字,并将它的生命周期延长到了当前行之外。现在让我们把右值引用排除在等式之外,我说的是严格意义上的右值到 const lvalue ref 的事情。所以我的问题还是一样,为什么'const lvalue ref'的要求成立,为什么'lvalue ref'不能满足?
【解决方案2】:

如果你问的是

void f(const int&);
f(1);

void g(int&);
g(1);

答案是想想如果g 看起来像这样会发生什么:

void g(int& r) {
    ++r;
}

【讨论】:

  • 也许是更简单的情况,int main(){ int &i=3; //produces error const int&j =3; //compiles return 1; }
  • @GoldenSpecOps - 如果您在初始化后添加++i;,您会看到为什么不允许这样做;如果它开始 int j = 1; int&i = j; ++i; 就可以了。
猜你喜欢
  • 2017-12-06
  • 2014-10-31
  • 1970-01-01
  • 2017-04-15
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
相关资源
最近更新 更多