将rvalue绑定到const左值引用

时间:2016-11-29 18:47:49

标签: c++ const lvalue rvalue

出于某种原因,我无法找到这个确切的问题。为什么允许将rvalue绑定到const lvalue reference,但如果没有const则不可能相同?

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

例如,请考虑以下代码:

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

2 个答案:

答案 0 :(得分: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 ++

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

struct obj {
};

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

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

答案 1 :(得分:0)

如果你问的是

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

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

答案是考虑如果g看起来会发生什么:

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