一般来说,您应该避免使用右值引用。
我想不出使用本地右值引用的真正好理由。我可以想象一个用例:延长临时对象的生命周期,同时允许对其进行读写访问(类似于绑定到 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 最近的推文:
你应该害怕右值引用,就像害怕上帝一样。他们强大而优秀,但对他们的要求越少越好