繁体   English   中英

如何通过值传递仅移动类型(例如std :: unique_ptr)?

[英]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!
}

住在Wandbox上

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM