shared_ptr构造函数参数是否应按值传递

Should shared_ptr constructor arguments be passed by value

本文关键字:是否 按值传递 参数 构造函数 ptr shared      更新时间:2023-10-16

当我将shared_ptr传递给将该参数复制到成员shared_ptr的构造函数时,是否应该按值传递该参数?

示例:

struct MyClass {
MyClass(std::shared_ptr<MyDependency> dep) 
: dep(dep)
{}
std::shared_ptr<MyDependency> dep;
};

如果使用临时(MyClass(std::make_shared<...>())(构造,编译器应该移动参数(一次或两次?(。

编译器是否能够"自动"将CCD_ 4移动到CCD_,还是应该使用: dep(std::move(dep))

如果使用左值构造,则该值将被复制(至少一次(。

另一方面,通过const-ref传递shared_ptr将始终复制指针。

那么,如果构造函数参数将直接复制到成员中,那么它们是否应该按值传递呢?

编辑:参数/成员必须是shared_ptr

是否应该通过值传递shared_ptr构造函数参数

如果您打算共享所有权,即您想保留一份副本:是的,传递值是首选方式。

如果使用临时。。。编译器应该移动参数(一次或两次?(。

首先移动构造参数,然后初始化成员(请参见下文(。在某些情况下,论点的结构可能会被忽略。

我应该使用: dep(std::move(dep))

是的,你应该这样做。参数有一个名称,因此它是一个左值。若要移动构件,您需要有一个右值。

我个人的方法是使用两个构造函数:

struct MyClass
{
MyClass(std::shared_ptr<MyDependency> const& dep) 
: dep(dep)
{}
MyClass(std::shared_ptr<MyDependency>&& dep) 
: dep(std::move(dep))
{}
std::shared_ptr<MyDependency> dep;
};

传递的L值(外部指针保留所有权(通常只复制一次,r值仍然只是引用,因此只移动一次。