c++ - 函数返回右值引用是否有意义?
问题描述
像这样的签名的有效用例是什么?:
T&& foo();
还是右值 ref 仅用作参数?
如何使用这样的功能?
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
并为自己节省昂贵的复制操作。
推荐阅读
- php - 使 symfony 安装相同版本的依赖项
- javascript - 使用 PDFKit 和 GCF 忽略已完成函数的异常
- r - 处理列表中的数据
- typescript - 如何使用 pixjs v5 配置我的 tsconfig?
- python - 如何使用 scl enable 在 dockerfile 中运行 python3 应用程序
- numpy - numpy 拒绝检索连接的值
- excel - 在 VBA 中向我当前的模块添加更多 if 语句
- javascript - 我该如何解决'
在android中不断停止'错误? - jms - 无法使用连接模式“客户端”和主机名连接到队列管理器“DevQueue01”
- gtk3 - 构建一个 GTK Gridview,就像一个不同高度的画廊