c++ - 函数返回右值引用是否有意义?

标签 c++

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

T&& foo();

还是右值引用仅用作参数?

如何使用这样的功能?

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

最佳答案

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

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

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 返回的 vector ,并且您可以为自己节省昂贵的复制操作。

关于c++ - 函数返回右值引用是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55958970/

相关文章:

c# - C# 中是否有与 IEnumerable<T> 等效的标准 C++?

c++ - `using` 只有基类的一些重载

c++ - 未定义模板的隐式实例化 : Boost Bug or Clang Bug?

c++ - 不明白.eof()在c++中是怎么工作的

c++ - 需要澄清 SFINAE 中的 Lambdas、auto 和 decltype

c++ - 全局数组分配——栈还是堆?

c++ - 局部静态变量初始化是线程安全的

c++ - std::vector 的正确分配

c++ - 迭代两种可能类型的可迭代对象 C++

c++ - 尝试从模板化函数返回 vector 会引发编译错误。