我可以传递unique_ptr对函数的引用吗?如果不是,我为什么要避免它?
前:
void func(unique_ptr<Clss>& ref);
main() {
unique_ptr<Clss> a = std::make_unique<Clss>();
fn(a);
}
答案 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参数)。
如果可以,请选择其中一个。