首页 > 解决方案 > 函数返回右值引用是否有意义?

问题描述

像这样的签名的有效用例是什么?:

T&& foo();

还是右值 ref 仅用作参数?

如何使用这样的功能?

T&& t = foo(); // is this a thing? And when would t get destructed?

标签: c++

解决方案


对于自由函数,返回右值引用没有多大意义。如果它是一个非静态本地对象,那么您永远不想返回指向它的引用或指针,因为它将在函数返回后被销毁。但是,返回对传递给函数的对象的右值引用可能是有意义的。这实际上取决于用例是否有意义。

可以从返回右值引用中受益匪浅的一件事是临时对象的成员函数。假设你有

class foo
{
    std::vector<int> bar;
public:
    foo(int n) : bar(n) {}
    std::vector<int>& get_vec() { return bar; }
};

如果你这样做

auto vec = foo(10).get_vec();

你必须复制,因为get_vec返回一个左值。如果您改为使用

class foo
{
    std::vector<int> bar;
public:
    foo(int n) : bar(n) {}
    std::vector<int>& get_vec() & { return bar; }
    std::vector<int>&& get_vec() && { return std::move(bar); }
};

然后vec将能够移动返回的向量,get_vec并为自己节省昂贵的复制操作。


推荐阅读