2016-11-29 153 views
3

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

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

例如,请考虑下面的代码:

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

问题是没有意义的。不能约束“右值”。只有引用可以绑定到任何东西。 – SergeyA

回答

0

您可能会发现下面的文章有用:

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

我可能是完全错误的在这里,但我这是怎么理顺这。一个右值是不变的,它不能被改变。你不能改变整数5,事实。所以当你绑定引用时,左值必须是const。采用G ++

只有这样,才能安全地绑定一个右值到左值

obj & a1 = bar(); 

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

要么通过标记左值作为常量,或使用可变右值引用&&是:否则你的编译器将抛出一个错误(在C++ 11引入相信吗?)

struct obj { 
}; 

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

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

我理解你的思维方式,但将右值绑定到左值之后,你的名字实际上就是赋予它一个名称,并将其寿命延长到当前行之外。现在让我们把右值引用排除在方程之外,我正在严格地讨论左值以便const左值ref。 所以我的问题仍然是一样的,为什么要求'const lvalue ref'成立,为什么不能只是'lvalue ref'就够了? – GoldenSpecOps

0

如果你问

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

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

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

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

也许更简单的情况下, 'INT主(){ INT &i=3; //产生错误 const int的&j =3; //编译 返回1; }' – GoldenSpecOps

+0

@GoldenSpecOps - 如果您在初始化后添加'++ i;',您将会看到为什么它不被允许;如果它开始'int j = 1; int &i = j; ++ i;'没关系。 –

相关问题