使用 make_shared 防止复制构造

Prevent copy-construction with make_shared

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

这是我想出的代码:

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

I read about perfect forwarding but it doesn't seem to help here.

我不明白为什么它不会。

只需删除 const 即可使 move 构造成为可能,并添加 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;
}

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