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