c++ 左值引用可以绑定到右值引用吗?在这个过程中会发生什么?

nhjlsmyf  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(129)

我试图弄清楚下面这段话的意思:

int main() {
    int&& a = 2;
    int& b = a;     // (*)
}

我知道a是一个左值表达式,类型为“对int的右值引用”,b是一个通用变量,类型为“对int的左值引用"。但是,b的初始化(*)似乎很奇怪。由于a的类型不是int,它不能匹配b引用的类型。有人能解释这个结果吗?在初始化(*)的过程中是否发生了隐式转换?或者我遗漏了什么概念或关键字?
代码可以在here中成功编译和运行。

fjaof16o

fjaof16o1#

任何引用都像是被引用的对象,因此当你把一个b引用绑定到另一个a引用时,实际上是把它绑定到了a引用的对象。
一个棘手的问题是右值引用本身就是一个左值,而C++只允许将左值引用绑定到左值,因此在这里不能绑定另一个右值引用:

int&& a = 2;
int&& b = a; // error

另一个值得注意的副作用是,示例中的a将临时对象的生存期延长到给定作用域的末尾(准确地说是a引用生存期的末尾)

相关问题