C++ 右值引用转换后的地址更改 #包括 使用名称空间std; int main() { int i=0; cout

C++ 右值引用转换后的地址更改 #包括 使用名称空间std; int main() { int i=0; cout,c++,type-conversion,rvalue-reference,C++,Type Conversion,Rvalue Reference,(short&&)i创建了一个临时对象,所以您获取了另一个对象的地址,所以地址可能不同。显然它创建了一个临时对象 实际上,编译器会自己告诉你。 试试这个: #include <iostream> using namespace std; int main() { int i = 0; cout << &i << endl; const auto &ref = (short&&)i; cout <<

(short&&)i
创建了一个临时对象,所以您获取了另一个对象的地址,所以地址可能不同。

显然它创建了一个临时对象

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

#include <iostream>
using namespace std;

int main()
{
  int i = 0;
  cout << &i << endl;

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

  return 0;
}
auto&ref=(short&&)i;

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

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


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

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

auto &ref = (short&&)i;
cout << &ref << endl;
因此,表达式
&ref
&i
将给出相同的结果

以下情况也是如此:

const auto& ref = i;
这基本上是一样的

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


,但你明白了。此外,不要这样写代码。
int
不是
short
,你不能假装它是。

是故意让
i
int
,但
ref
是对
short
的引用吗?准确地说,标题应该是“。在对不匹配类型转换进行右值引用之后。”并且可以通过使用
int&
找到一个很好的线索。
short
&
根本不重要,
const auto&ref=(int)i、 
给出了相同的结果。@Evg答案部分在下面---vvv@Ron对引用应用运算符的ta非重载地址与将所述地址应用于被引用对象(即被引用对象的地址)同义。删除
短(&&
强制转换并运行代码,您将看到打印的地址相同。因此,唯一的结论是,由于该强制转换,
ref
i
在OPs案例中不引用相同的对象。在哪些情况下,我们可能会得到相同的地址?@Evg:实际上,我会说,具有正确的结尾和““contness”,编译器可能被允许使用相同的地址(即使我对此表示怀疑),类似于
“cd”
可能是
“abcd”+2
。答案很好。你的答案的第一段有引文吗?@P.W.hmm我检查了标准,它说如果转换可以用以上列出的多种方式进行解释,则使用列表中首先出现的解释,即使该解释产生的转换格式不正确。”(列表为常量、静态、静态+常量、重新解释、重新解释+常量)这似乎与我有点矛盾。我不清楚“是否可以解释转换”与“解释格式不正确时”之间到底有什么区别。这是否意味着
(short&)i
根本不能解释为静态强制转换?如果可以,应该是,对吗?@P.W对。不能将int静态强制转换为short&,因为int不是short。
const auto& ref = (int&)i;