使用 make_shared 防止复制构造

空气

我有一个管理器类,它允许客户端通过两种方法添加组件:一种没有参数默认构造组件,另一种采用右值(这应该允许客户端使用组件的自定义构造函数)。

这是我想出的代码:

template <class TComponent>
std::shared_ptr<TComponent> AddComponent()
{
    return AddComponent(TComponent{ this });
}

template <class TComponent>
std::shared_ptr<TComponent> AddComponent(const TComponent &&obj)
{
    auto ptr = std::make_shared<TComponent>(obj);
    vec.push_back(ptr);
    return ptr;
}

我的问题是std::make_shared总是复制构造对象。有没有办法防止这种行为?我读过关于完美转发的文章,但在这里似乎没有帮助。

埃罗里卡

我读过关于完美转发的文章,但在这里似乎没有帮助。

我不明白为什么它不会。

只需删除 const 以使移动构造成为可能,然后添加std::forward

template <class TComponent>
std::shared_ptr<TComponent> AddComponent(TComponent &&obj)
{
    auto ptr = std::make_shared<TComponent>(std::forward<TComponent>(obj));
    vec.push_back(ptr);
    return ptr;
}

现在,右值将被移动。左值将被复制,这是您无法避免的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么boost :: make_shared使用复制语义

来自分类Dev

使用Bitfields中的参数进行构造时,std :: make_shared无法编译

来自分类Dev

使用make_shared会发生什么

来自分类Dev

使用make_shared的更短方法?

来自分类Dev

为什么std :: make_shared需要默认构造函数?

来自分类Dev

如何避免使用std :: make_shared分配大内存

来自分类Dev

如何使shared_ptr包装器类与make_shared一起使用

来自分类Dev

使用make_shared <std :: thread>创建shared_ptr <std :: thread>的实例

来自分类Dev

使用shared_ptr和make_shared时出现奇怪的编译器错误

来自分类Dev

通过make_unique / make_shared调用initializer_list构造函数

来自分类Dev

std :: make_shared在VS2012中进行两个构造函数调用

来自分类Dev

带有std :: make_shared的密码成语。xmemory无法访问私钥构造函数

来自分类Dev

是否可以强制`std :: make_shared`使用类的新运算符?

来自分类Dev

有什么情况下我不使用std :: make_shared吗?

来自分类Dev

是什么阻止编译器自动推导使用make_shared?

来自分类Dev

在std :: make_shared中使用C ++聚合初始化

来自分类Dev

如何使用std :: make_shared创建基类类型的智能指针?

来自分类Dev

为什么不能使用std :: make_shared的实例化作为函数的指针?

来自分类Dev

是什么阻止编译器自动推导使用make_shared?

来自分类Dev

共享指针仅通过std :: shared_ptr初始化。std :: make_shared构造函数不起作用

来自分类Dev

无法将自定义分配器与allocate_shared / make_shared一起使用

来自分类Dev

使用shared_ptr <T>的make_shared仅对T <56字节有用吗?

来自分类Dev

使用std :: make_shared以std :: array作为参数来初始化std :: shared_ptr

来自分类Dev

为什么std :: make_shared无法使用已删除的运算符new进行类型编译?

来自分类Dev

new and make_shared for shared pointers

来自分类Dev

C ++ std :: shared_ptr,是否operator =重载以使用复制构造函数?

来自分类Dev

使用反射复制构造函数

来自分类Dev

如何make_shared派生类?

来自分类Dev

'make_shared'不明确

Related 相关文章

  1. 1

    为什么boost :: make_shared使用复制语义

  2. 2

    使用Bitfields中的参数进行构造时,std :: make_shared无法编译

  3. 3

    使用make_shared会发生什么

  4. 4

    使用make_shared的更短方法?

  5. 5

    为什么std :: make_shared需要默认构造函数?

  6. 6

    如何避免使用std :: make_shared分配大内存

  7. 7

    如何使shared_ptr包装器类与make_shared一起使用

  8. 8

    使用make_shared <std :: thread>创建shared_ptr <std :: thread>的实例

  9. 9

    使用shared_ptr和make_shared时出现奇怪的编译器错误

  10. 10

    通过make_unique / make_shared调用initializer_list构造函数

  11. 11

    std :: make_shared在VS2012中进行两个构造函数调用

  12. 12

    带有std :: make_shared的密码成语。xmemory无法访问私钥构造函数

  13. 13

    是否可以强制`std :: make_shared`使用类的新运算符?

  14. 14

    有什么情况下我不使用std :: make_shared吗?

  15. 15

    是什么阻止编译器自动推导使用make_shared?

  16. 16

    在std :: make_shared中使用C ++聚合初始化

  17. 17

    如何使用std :: make_shared创建基类类型的智能指针?

  18. 18

    为什么不能使用std :: make_shared的实例化作为函数的指针?

  19. 19

    是什么阻止编译器自动推导使用make_shared?

  20. 20

    共享指针仅通过std :: shared_ptr初始化。std :: make_shared构造函数不起作用

  21. 21

    无法将自定义分配器与allocate_shared / make_shared一起使用

  22. 22

    使用shared_ptr <T>的make_shared仅对T <56字节有用吗?

  23. 23

    使用std :: make_shared以std :: array作为参数来初始化std :: shared_ptr

  24. 24

    为什么std :: make_shared无法使用已删除的运算符new进行类型编译?

  25. 25

    new and make_shared for shared pointers

  26. 26

    C ++ std :: shared_ptr,是否operator =重载以使用复制构造函数?

  27. 27

    使用反射复制构造函数

  28. 28

    如何make_shared派生类?

  29. 29

    'make_shared'不明确

热门标签

归档