2
int n = 1;
double&& rref = n;  

在什么样的场景下我们需要初始化一个右值变量,给定

  • 我们可以通过 move 将值转换为右值
  • 命名变量是左值

?

编辑:

我将示例更改为 double&& 以使其编译。这个问题仍然存在,或者在我看来更相关。

一些背景知识,我在 cppreference 上读到“右值可用于初始化右值引用,在这种情况下,由右值标识的对象的生命周期会延长,直到引用范围结束。” 我不太明白这句话的意思。不管它是否是右值,我们必须决定是否延长一个变量的生命周期,大概是从另一个函数返回的?

4

2 回答 2

5

一般来说,您应该避免使用右值引用。

我想不出使用本地右值引用的真正好理由。我可以想象一个用例:延长临时对象的生命周期,同时允许对其进行读写访问(类似于绑定到 a const T&,但没有const限制):

T f();
T && r = f();
// can use 'r' here for const/non-const access

虽然在这种简单的情况下,您可能会争辩说使用值是更好的选择,但在某些情况下,返回的确切类型f()是未知的,但您确实知道它是从基础派生的,在这种情况下,您可以使用该技巧以上以延长使用寿命:

template <typename T>
Derived<T> f(T const &);  // Derived<T> extends Base

Base && r = f(1);          // Extends lifetime

但即使在那个具体的用例中,在 C++11 中也有更好的工具,比如auto

auto r = f(1);

这将创建一个由 . 返回的具体类型的局部变量f。所以它真的没有启用任何功能。

当您需要区分 rvalue 和 lvalue时,rvalue-references 很重要的地方是作为函数的参数。如果两种情况下的行为相同(即您将复制),则只需按值获取参数。

引用 Eric Niebler 最近的推文:

你应该害怕右值引用,就像害怕上帝一样。他们强大而优秀,但对他们的要求越少越好

于 2013-10-25T15:30:14.753 回答
1

我知道通过在此处复制粘贴相关部分来仅链接到文章而不正确侵犯版权是一种耻辱,但本文解释了为什么&&可以用作“通用参考”。

简而言之,写作

auto&& //...

确保最大程度的无忧性,与auto此处表示的类型无关。

于 2013-10-25T15:15:31.367 回答