代码之家  ›  专栏  ›  技术社区  ›  olist

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

  •  2
  • olist  · 技术社区  · 6 年前
    #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 生成临时变量?

    4 回复  |  直到 6 年前
        1
  •  4
  •   eerorika    6 年前

    那是因为你在做不同类型的演员。如果可以解释为静态转换,那么C风格的显式转换转换转换总是静态转换;否则,它会重新解释演员阵容。和/或根据需要浇筑混凝土。

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

    (short&)i 是重新解释的类型转换,因为它不能解释为 static_cast<short&>(i) 这是错误的形式。它将int引用重新解释为短引用,并且 绑定到同一对象。请注意,通过此引用访问对象将具有未定义的行为。

        2
  •  3
  •   Lightness Races in Orbit    6 年前

    const auto& ref = i;
    

    表达式 &ref &i 因此会得到相同的结果。

    const auto& ref = (int&)i;
    

    基本上是一样的。

    但是,对不是左值引用的对象进行强制转换 T (因此,对于一个值,或者对于另一个类型的rvalue引用!)必须创建临时文件;当绑定到时,此临时对象将经历生存期延长 ref . 但是现在 不“指” i ,因此结果的地址会有所不同。

    It's actually a little more complicated than that int 不是一个 short 你不能假装是。

        3
  •  2
  •   Constantinos Glynos    6 年前

    很明显,它创造了一个暂时的。

    试试这个:

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

    错误显示:

    错误:对类型“short”的非常量左值引用无法绑定到

    测试代码 here .

        4
  •  1
  •   Jarod42    6 年前

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