我可以将unique_ptr的引用传递给函数吗?

时间:2018-02-19 10:21:33

标签: c++

我可以传递unique_ptr对函数的引用吗?如果不是,我为什么要避免它?

前:

void func(unique_ptr<Clss>& ref);

main() {
   unique_ptr<Clss> a = std::make_unique<Clss>();
   fn(a);
}

5 个答案:

答案 0 :(得分:4)

  

我可以将unique_ptr的引用传递给函数吗?

是的,unique_ptr与其他任何类似。

如果您想要从函数中改变现有的unique_ptr(例如,在函数上调用.reset()),则应该执行此操作。

如果您只想访问unique_ptr<T>内的对象,请在功能界面中选择T&const T&,以便它们可以独立于unique_ptr使用。< / p>

答案 1 :(得分:2)

根据Herb Sutter的说法:

https://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters/

通过引用传递unique_ptr是为了输入/输出unique_ptr参数。

void f( unique_ptr<widget>& ); // (d)

这应仅用于接受输入/输出unique_ptr,当函数实际上接受现有的unique_ptr并可能修改它以引用不同的对象时。 接受小部件是一种不好的方式,因为它仅限于调用者中的特定生命周期策略。

谢谢@sgvd

答案 2 :(得分:1)

请参阅此代码段,两种将unique_ptr作为函数参数传递的方法。 fun1将取得对象的所有权(因此应该从调用者转发)但是func2提交引用unique_ptr对象将作为引用传递,并且不会被函数修改。

void func1(unique_ptr<Clss>&& moved_obj) // this function takes ownership
{
    //do something with the moved_obj

    moved_obj.reset();
}

void func2(const unique_ptr<Clss>& ref_obj) // this function takes reference
{
   unique_ptr<Clss> new_obj = std::make_unique<Clss>(*(ref_obj));
}


int main() {

   unique_ptr<Clss> a = std::make_unique<Clss>();
   func1(std::move(a));

   unique_ptr<Clss> b = std::make_unique<Clss>();
   func2(b);

    return 0;
}

答案 3 :(得分:0)

std::unique_ptr传递给函数是完全正常的,只要您遵守将常规引用传递给函数时所遵循的相同规则:

  • 基础std::unique_ptr及其指向的对象必须至少存在,只要该函数将使用该引用;
  • 如果是多线程,必须设置障碍。

答案 4 :(得分:0)

我看到那些有效的有意义的签名:

void take_ownership(std::unique_ptr<Clss>);
// or void take_ownership(std::unique_ptr<Clss>&&);

void use(/*const*/ Clss*);
// or void use(/*const*/ Clss&);

std::unique_ptr<Clss> create(/*args..*/);

void might_take_ownership(std::unique_ptr<Clss>&);

后者可能有意义,但更难理解(如任何I / O参数)。

如果可以,请选择其中一个。