将unique_ptr而不是*传递给方法

时间:2017-05-22 12:19:08

标签: c++ c++11 smart-pointers unique-ptr

我有一个POD我用作unique_ptr而lldb告诉我它的类型为POD *。 我有一个自由浮动函数我想传递这个POD的引用,以便我可以填充公共属性。

如果我在函数中添加POD *类型的参数,Clang在编译我的代码时没有问题,但如果我尝试传递unique_ptr<POD> &paramunique_ptr<POD param,则会失败:

Candidate function not viable: no known conversion from ' *' to 'unique_ptr<>'

我以为我总能传递一个unique_ptr我会有一个原始指针,反之亦然?

更新,方法签名:

原件:

void connection_fsm(const LogLevel &level, const bytes &barray, unique_ptr<PGOutput> &output) noexcept;

VS

void connection_fsm(const LogLevel &level, const bytes &barray, unique_ptr<Conn> &conn, unique_ptr<PGOutput> &output) noexcept;

VS

void connection_fsm(const LogLevel &level, const bytes &barray, unique_ptr<Conn> conn, unique_ptr<PGOutput> &output) noexcept;

VS

void connection_fsm(const LogLevel &level, const bytes &barray, Conn *conn, unique_ptr<PGOutput> &output) noexcept;

2 个答案:

答案 0 :(得分:3)

unique_ptr意味着所有权。你转让所有权吗?如果没有,请不要通过unique_ptr。请记住,unique_ptr将在销毁时删除基础对象。出于这个原因,它也是不可复制的(拥有一些独特的东西是没有意义的。)

传递原始指针没有任何问题,只要它们的生命周期超出被调用方法的生命周期。

传递对unique_ptr的引用不会仅仅传递原始指针。最后,它不适合你,因为不可能将临时(rvalue)绑定到左值引用。

答案 1 :(得分:2)

从原始指针到唯一指针的可用转换是这个构造函数:

explicit unique_ptr( pointer p ) noexcept;

由于该构造函数已标记为explicit,因此不会考虑隐式转换。

这很好,因为如果我们强制进行转换:

T * raw = get_it_from_somewhere ();
// Assume function takes unique_ptr by value or reference
function(std::unique_ptr<T>{raw});
//              ^^ a temporary
delete raw;

然后临时唯一指针将获取指向对象的所有权,从而在函数调用后删除它!因此,使用上面的代码,您将获得双重删除(当然,在函数调用后无法取消引用该指针)。

如果您打算将所有权传递给function,那么现在没问题,但是否则您不应该使用唯一指针。最好传递一个(如果可能const)引用或(如果你需要“可空”行为)原始指针。