int n = 1;
double&& rref = n;
在什么样的情况下我们需要初始化一个rvalue变量,给定
编辑:
我将示例改为double&&使它编译。在我看来,这个问题仍然存在,甚至更具相关性。
有些背景,我在cppreference上读到“rvalue可用于初始化rvalue引用,在这种情况下,rvalue标识的对象的生命周期会延长,直到引用的范围结束。”我不太明白这句话的重点。无论它是否是rvalue,我们必须决定是否延长变量的生命周期,可能是从另一个函数返回的?
答案 0 :(得分:5)
通常应该避免使用rvalue-references。
我无法想到使用本地rvalue-reference的好原因。我可以想象一个用例:延长临时的生命周期,同时允许对它进行读写访问(类似于绑定到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-references很重要的是作为函数的参数,当需要区分rvalue和lvalue 时,。如果两种情况下的行为都相同(即你要复制),那么只需按值进行参数。
引用Eric Niebler最近的推文:
你应该害怕rvalue refs就像有人可能会敬畏上帝一样。它们强大而且好,但对它们的要求越少越好
答案 1 :(得分:1)
我知道仅通过复制粘贴相关部分来链接到没有正确侵犯版权的文章是一种耻辱,但this article解释了为什么&&
可以用作“通用参考”。< / p>
简而言之,写作
auto&& //...
确保最大程度的无忧,独立于auto
所代表的类型。