c++ - 如何按值传递只移动类型(例如 std::unique_ptr)?
问题描述
如果我们std::unique_ptr
举个例子,将只移动类型传递给接收器函数(例如,获取指针所有权的构造函数)的普遍智慧是按值传递它并在调用站点移动它。例如
class Sink {
public:
Sink(std::unique_ptr<Foo> foo) : foo(std::move(foo)) {}
private:
std::unique_ptr<Foo> foo;
};
这怎么可能?编译器不应该能够立即推断出这std::unique_ptr
是一个仅移动类型并拒绝使用Sink(std::unique_ptr<Foo>)
吗?这里的按值传递规则有什么特别之处吗(即按值传递的东西被复制到该函数激活框架中)?
提前致谢。
解决方案
当然,只要您将右值传递给 Sink 的构造函数或移动参数,这是可行的。在这两种情况下,将为参数调用移动构造函数,而不是(删除的)复制构造函数。
注意:我认为std::move
这里不是一个好主意,因为这样你的函数中就会有一个移动的对象。静态分析可能会发现这一点,但它是错误的来源。
#include <memory>
struct Foo {};
class Sink {
public:
Sink(std::unique_ptr<Foo> foo) : foo(std::move(foo)) {}
private:
std::unique_ptr<Foo> foo;
};
int main() {
// rvalue
Sink s(std::make_unique<Foo>());
// std::move (can be dangerous)
auto f = std::make_unique<Foo>();
Sink ss(std::move(f));
// By value is not allowed
auto ff = std::make_unique<Foo>();
//Sink sss(ff); // BOOM!
}
推荐阅读
- create-react-app - 如何使用 Yarn 工作区在 CRA 中导入通用模块?
- java - 如何将 URL 图像设置为 AR Core Augmented Image?
- javascript - 如何在iMacros中使用XPCOM加载数据和写入数据
- android - 如何在附加图像上显示的 Android Firebase 中创建尺寸选项
- python - 在损失函数中点张量时不存在 pytorch 梯度
- java - 使用 Spring 访问共享配置对象
- firefox - Firefox 67 browser.downloads.download(...) cookie 数据丢失
- database - 如何使用 Cakephp3 以一种好的方式配置树?
- mysql - mysql 5.7游标不返回任何值
- c# - ApiController 正在为 CSV 字符串返回双转义字符串