首页 > 解决方案 > 右值引用转换后的地址更改

问题描述

#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++type-conversionrvalue-reference

解决方案


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

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

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


推荐阅读