![](/img/trans.png)
[英]Does std::bind work with move-only types in general, and std::unique_ptr in particular?
[英]How is it possible to pass move-only types (e.g. std::unique_ptr) by value?
如果我们以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>)
? 这里的值传递规则是否有特殊之处(即通过值传递的东西被复制到该函数激活框架中)?
提前致谢。
当然这是有效的,只要你将rvalue传递给Sink的构造函数或移动参数即可。 在这两种情况下,都将为参数调用移动构造函数而不是(已删除的)复制构造函数。
注意:我不认为std::move
在这里是一个好主意,因为那时你将在你的函数中有一个移动的对象。 静态分析可能会发现这一点,但它是一个bug的来源。
#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!
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.