我试图弄清楚下面这段话的意思:
int main() { int&& a = 2; int& b = a; // (*) }
我知道a是一个左值表达式,类型为“对int的右值引用”,b是一个通用变量,类型为“对int的左值引用"。但是,b的初始化(*)似乎很奇怪。由于a的类型不是int,它不能匹配b引用的类型。有人能解释这个结果吗?在初始化(*)的过程中是否发生了隐式转换?或者我遗漏了什么概念或关键字?代码可以在here中成功编译和运行。
a
b
(*)
fjaof16o1#
任何引用都像是被引用的对象,因此当你把一个b引用绑定到另一个a引用时,实际上是把它绑定到了a引用的对象。一个棘手的问题是右值引用本身就是一个左值,而C++只允许将左值引用绑定到左值,因此在这里不能绑定另一个右值引用:
int&& a = 2; int&& b = a; // error
另一个值得注意的副作用是,示例中的a将临时对象的生存期延长到给定作用域的末尾(准确地说是a引用生存期的末尾)
1条答案
按热度按时间fjaof16o1#
任何引用都像是被引用的对象,因此当你把一个
b
引用绑定到另一个a
引用时,实际上是把它绑定到了a
引用的对象。一个棘手的问题是右值引用本身就是一个左值,而C++只允许将左值引用绑定到左值,因此在这里不能绑定另一个右值引用:
另一个值得注意的副作用是,示例中的
a
将临时对象的生存期延长到给定作用域的末尾(准确地说是a
引用生存期的末尾)