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

时间:2018-07-27 09:15:44

标签: c++ constructor pass-by-reference move pass-by-value

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

示例:

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

    std::shared_ptr<MyDependency> dep;
};

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

编译器是否能够“自动”将dep移至dep, 还是应该使用: dep(std::move(dep))

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

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

如果将构造函数参数直接复制到成员中,那么应该通过值传递它们吗?

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

2 个答案:

答案 0 :(得分:3)

  

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

如果您打算共享所有者,即要保留副本:是的,按值传递是首选方式。

  

如果使用临时结构进行构造,则编译器应移动参数(一次还是两次?)。

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

  

我应该使用=SUM(FILTER(D:D, A:A=A9))

是的,你应该。参数有一个名称,因此它是一个左值。要移动构造成员,您需要有一个右值。

答案 1 :(得分:3)

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

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值仍然只是引用,因此仅移动了一次。