出于某种原因,我无法找到这个确切的问题。为什么允许将rvalue
绑定到const lvalue reference
,但如果没有const
则不可能相同?
我确实理解rvalue的生命周期以某种方式获得扩展(在第一种情况下),但如果是这样,为什么编译器不允许更改'rvalue',这不再是临时对象。
例如,请考虑以下代码:
int main(){
int &i=3; //produces error
const int&j =3; //compiles
return 1;
}
答案 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;
}