使用make_shared

时间:2017-06-08 15:26:44

标签: c++ shared-ptr copy-constructor

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

这是我提出的代码:

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 总是复制构造对象。有没有办法防止这种行为? 我读到了关于完美转发的内容,但这似乎没有帮助。

1 个答案:

答案 0 :(得分:2)

  

我读到了关于完美转发的内容,但这似乎没有帮助。

我不明白为什么不会。

只需删除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;
}

现在,rvalues将被移动。 Lvalues将被复制,你无法避免。