C++ 将左值引用绑定到右值引用?

C++ 将左值引用绑定到右值引用?,c++,reference,forward,lvalue,rvalue,C++,Reference,Forward,Lvalue,Rvalue,我已尝试编译: int &&a=3; int &b=a; 而且它起作用了。 我知道“a”是一个左值,但为什么我可以将“对int的右值引用”绑定到“对int的左值引用(而不是对int的右值引用)”? 这样,我可以更改临时值,3: b=5 //changing the value of the temporary bound to the rvalue reference 这项技术是从std::forward使用的,因此我认为这是一种标准行为。 对int的右值引用是否被视

我已尝试编译:

int &&a=3;
int &b=a;
而且它起作用了。 我知道“a”是一个左值,但为什么我可以将“对int的右值引用”绑定到“对int的左值引用(而不是对int的右值引用)”? 这样,我可以更改临时值,3:

b=5 //changing the value of the temporary bound to the rvalue reference
这项技术是从std::forward使用的,因此我认为这是一种标准行为。 对int的右值引用是否被视为存储临时值的简单int左值?
如果没有,您如何解释绑定?

引用不绑定到其他引用;它们绑定到对象。

当您从
3
初始化
a
时,您将创建一个新的临时
int
对象
b
只是对该对象的另一个引用

请注意,
a
是一个左值,因为它是一个命名对象的表达式,即使它的类型为“rvalue reference to
int
”!注意不要将类型与值类别混淆,这里:类型与对象相关,而值类别与表达式相关(即使这些表达式命名或以其他方式计算某个对象)


当你仔细考虑时,这些令人困惑的规则都非常巧妙地结合在一起:为了使原始引用有效,对象的生存期必须延长,因此
b
的初始化是安全的。

但是,我知道只有常量左值引用可以绑定到临时引用。如果一个普通左值引用的生存期被延长,有没有任何规则可以将它绑定到一个临时引用?@Toccio:那不是真的。只有常量左值引用(和右值引用)可以绑定到通过右值表达式访问的对象。但是
a
是一个左值表达式,因为它引用了对象的名称。还有一个问题:当我将左值引用a绑定到另一个左值引用B,它引用C时,我真正做的是将a绑定到C,对吗?那么,如果B是右值引用,C是临时引用,这就像我将a绑定到C一样吗?@Toccio:Ehm我想是的;你的问题不太清楚。嗯,试着这样做:int&可以绑定到int左值、int&和int&&这是左值(如第一篇文章中的示例)。更改int的值&就像更改它引用的对象的值一样。调用这个对象O,如果O反过来是一个引用(rvalue或lvalue无关紧要),那么对O的更改将反过来是对O引用的对象的更改,依此类推,直到a达到非引用类型。这一切都对吗?