我有一个允许客户端通过两种方法添加组件的管理器类:一个没有参数,默认构造组件,另一个采用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 总是复制构造对象。有没有办法防止这种行为? 我读到了关于完美转发的内容,但这似乎没有帮助。
答案 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将被复制,你无法避免。