【问题标题】:What does it mean to take the address of an rvalue reference?获取右值引用的地址是什么意思?
【发布时间】:2014-10-15 08:14:57
【问题描述】:

给定

void foo( int&& x ) {

    std::cout << &x;
}

这行得通,但这个地址实际上代表什么?调用 foo 时是否创建了一个临时的int,这就是地址所代表的含义?如果这是真的并且如果我写int y = 5; foo(static_cast&lt;int&amp;&amp;&gt;(y));,这是否会导致创建另一个临时变量,或者编译器会智能地引用 y?

  • 不一定是临时的。没有什么能阻止你做int x = 42; foo(x);
  • FWIW,你的演员只是std::move(y)
  • @IgorTandetnik,这不会编译,因为右值引用不会绑定到左值。
  • @chris 我知道,但我只是想明确声明我正在创建一个右值引用,因为 std::move 没有最好的名称
  • 右值不必是临时的。临时值是纯右值,但并非所有右值都是临时值。绑定到右值引用的对象的关键特征是该对象不应有任何其他别名。 (这不是由类型系统强制执行的,但这是您应该使用它的方式。)

标签: c++ c++11 c++14


【解决方案1】:

当您获取右值引用的地址时,它会返回一个指向该引用所绑定的对象的指针,就像左值引用一样。该对象可以是临时对象,也可以不是临时对象(例如,如果您像在代码中那样将左值转换为右值引用)。

int y = 5; foo(static_cast&lt;int&amp;&amp;&gt;(y)); 不会创建临时文件。标准的5.2.9/3 部分描述了这种转换:

如果“cv2 T2”与“cv1 T1”引用兼容,则“cv1 T1”类型的泛左值、类纯右值或数组纯右值可以转换为“cv2 T2”类型的“右值引用”。

例如,如果您调用foo(1);,则会创建一个临时的。

【讨论】:

  • 在谈到右值时,我更喜欢使用术语“匿名变量”而不是“时间对象”。因此,详细程度降低了:«std::move 使对象匿名”,int&amp;&amp; x 绑定到匿名整数。
  • @Peregring-lk 如果您撰写自己的博客文章或与您认识很长时间的人交谈,或者您应该参考一些来源,您可以做到这一点,因为 C++ 标准中没有“匿名对象”的定义。在这里回答时,我认为最好使用每个人都知道或至少可以在众所周知的地方查找的术语。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 2013-04-12
  • 2020-07-19
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
相关资源
最近更新 更多