shared_ptr构造函数参数是否应按值传递
Should shared_ptr constructor arguments be passed 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<...>())
(构造,编译器应该移动参数(一次或两次?(。
编译器是否能够"自动"将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值仍然只是引用,因此只移动一次。
相关文章:
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- C++类 - 初始化列表 - 递归 - 按值传递
- 将函数参数完美转发到函数指针:按值传递呢?
- 棘手的按值传递和按引用递归问题传递
- 不同于按值传递和常量引用传递的程序集
- 按值传递变量与按引用传递变量具有相同的结果
- 为什么按值传递QStringView比引用常量更快?
- 获取 std::函数以推断按引用传递/按值传递
- 在函数中按值传递 unordered_map/unordered_set 是否有效? C++
- C++/11 auto 关键字是在更有效时推导参数进行按引用传递,还是始终按值传递?
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- shared_ptr构造函数参数是否应按值传递
- 使用 std::move 将参数传递给函数,如果该参数声明为按值传递或使用移动操作数 &&,是否有区别?
- 通过引用传递基元类型(如 int、bool)是否比按值传递有任何加速?还是会恶化时间/空间的使用
- 当空变量没有定义时,按值传递它们是否安全
- 是否可以按值传递临时对象而不破坏C++中的原始对象
- 在按值传递的重成员的构造函数初始化列表中是否真的需要std::move ?
- 在 Go 方法中按值传递"this"是否会对性能造成损失?
- 输入参数传递:是否存在有效的按值传递的大小阈值