gpt4 book ai didi

c++ - 如何按值传递仅 move 类型(例如 std::unique_ptr)?

转载 作者:行者123 更新时间:2023-11-30 02:19:02 24 4
gpt4 key购买 nike

如果我们取 std::unique_ptr例如,将仅 move 类型传递给接收器函数(例如,获取指针所有权的构造函数)的普遍智慧是按值传递它并在调用站点 move 它。例如

class Sink {
public:
Sink(std::unique_ptr<Foo> foo) : foo(std::move(foo)) {}

private:
std::unique_ptr<Foo> foo;
};

这怎么可能?编译器不应该能够立即推断出std::unique_ptr吗?是只 move 类型,拒绝使用 Sink(std::unique_ptr<Foo>) ?这里的按值传递规则有什么特别之处吗(即按值传递的东西被复制到函数激活框架中)?

提前致谢。

最佳答案

当然这可行,只要您将右值传递给 Sink 的构造函数或 move 参数即可。在这两种情况下,都会为参数调用 move 构造函数,而不是(已删除的)复制构造函数。

N.B.:我认为 std::move 在这里不是一个好主意,因为这样您的函数中就会有一个 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!
}

Live on Wandbox

关于c++ - 如何按值传递仅 move 类型(例如 std::unique_ptr)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51295303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com