右值引用转换后的地址更改

address changes after a rvalue reference conversion

本文关键字:地址 引用 转换      更新时间:2023-10-16
#include <iostream>
using namespace std;
int main()
{
int i = 0;
cout << &i << endl;
const auto &ref = (short&&)i;
cout << &ref << endl;
return 0;
}

为什么&i&ref不同?(short&)i不会导致此问题。(short&&)i生成临时变量吗?

这是因为您正在做不同类型的演员表。C 样式显式转换强制转换始终执行静态强制转换,如果它可以解释为静态转换;否则,它会重新解释演员表。和/或根据需要进行常量转换。

(short&&)i是静态强制转换,因为它可以解释为static_cast<short&&>(i)。它创建一个临时short对象,ref绑定到该对象。作为一个不同的对象,它有一个不同的地址。

(short&)i是重新解释演员表,因为它不能被解释为static_cast<short&>(i)格式不正确。它将 int 引用重新解释为短引用,并且ref绑定到同一对象。请注意,通过此引用访问对象将具有未定义的行为。

这将创建对存在的事物的左值引用:

const auto& ref = i;

因此,表达式&ref&i将给出相同的结果。

这也适用于:

const auto& ref = (int&)i;

这基本上是一回事。

但是,强制转换为不是对T的左值引用(因此,转换为值或其他类型的右值引用!(必须创建一个临时;当绑定到ref时,此临时会经历生存期延长。但是现在ref不"引用"i,所以地址结果会有所不同。

它实际上比这复杂一些,但你明白了。此外,不要这样编写代码!int不是short,你不能假装它是。

显然它创建了一个临时的。

实际上编译器会告诉你自己。 试试这个:

auto &ref = (short&&)i;
cout << &ref << endl;

错误说:

错误:对类型"short"的非常量左值引用无法绑定到 "短"类型的临时

在此处测试代码。

(short&&)i创建一个临时对象,因此您获取其他对象的地址,因此地址可能会有所不同。