将rvalue绑定到const左值引用

Eli*_*doo 7 c++ const rvalue lvalue

出于某种原因,我无法找到这个确切的问题.为什么它被允许绑定rvalueconst lvalue reference,虽然如果没有它就不可能相同const

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

例如,请考虑以下代码:

int main(){
   int &i=3; //produces error
   const int&j =3; //compiles
   return 1;
}
Run Code Online (Sandbox Code Playgroud)

小智 5

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

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

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

obj & a1 = bar();

invalid initialization of non-const reference of type ‘obj&’ from an rvalue of type ‘obj’
Run Code Online (Sandbox Code Playgroud)

使用 g++

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

struct obj {
};

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

int main() {
const obj & a1 = bar();
obj && a2 = bar();
return 0;
};
Run Code Online (Sandbox Code Playgroud)