【问题标题】:Rvalue to lvalue conversion?右值到左值的转换?
【发布时间】:2017-11-24 11:01:55
【问题描述】:

为什么不能将右值转换为左值?但是,可以在相反的方向进行转换。从技术上讲,右值确实有一个内存地址,不是吗?

【问题讨论】:

  • 思想实验:int x = 1; -- 1 在这里是一个右值。文字 1 是否有内存地址?可以&1获取地址吗?
  • 将右值传递给函数。说真的,尽管右值在获得它的访问权限的表达式的末尾将不复存在,给你留下一个悬空指针。
  • @cdhowie 为什么const int& bon = 2; 可能呢?
  • @OfT 因为允许临时对象绑定到 const 引用,这延长了临时对象的生命周期。这并没有改变 2 是右值的事实。我的评论旨在让您三思而后行“从技术上讲,右值确实有内存地址,对吗?”答案是并非所有右值都有内存地址.
  • @OfT 没错。诀窍是您不能获取没有名称(右值)的东西的地址。但是通过将该临时对象绑定到一个引用,您已经给它一个名称(请记住,引用只是对象的另一个名称),因此您可以获取它的地址。

标签: c++ c++11 type-conversion rvalue-reference lvalue


【解决方案1】:

编写模板函数unmove() 相当简单,与std::move() 相反:

template<class T> T& unmove(T&& t) { return t; }

请注意,根据 C++11 以来的标准:

在函数调用中与引用参数的临时绑定一直存在,直到包含该函数调用的完整表达式结束:如果函数返回的引用比完整表达式的寿命长,则它成为悬空引用。

因此在单个完整表达式中使用unmove() 是安全的,但在表达式被完全评估后,临时变量就会消失。

unmove() 的常见用途是调用函数/方法,当我不需要这些值时,它们通过引用返回值。

【讨论】:

    【解决方案2】:

    你可以:

    int&& x = 3;
    

    x 现在是一个左值。所谓的“右值引用”可以绑定到一个临时的, 但是任何名称都是左值,所以如果你需要它的右值,你需要forward&lt;&gt;()它。

    请注意,通过将临时对象绑定到右值引用(或 const 引用)可以延长其生命周期。从技术上讲,演员是可能的, 但不推荐,因为临时的寿命很短,所以你 通常会得到一个悬空引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      相关资源
      最近更新 更多