将unique_ptr而不是 * 传递给方法



我有一个用作unique_ptr的 POD,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;

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

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

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

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

传递原始指针并没有错,只要它们的生存期超过被调用方法的生存期即可。

传递对unique_ptr的引用不会比仅传递原始指针增加任何价值。最后,它对您不起作用,因为无法将临时(右值(绑定到左值引用。

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

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(引用或(如果需要"可为空"行为(原始指针。

相关内容

  • 没有找到相关文章

最新更新