我有一个包含unique_ptr向量的类。该类还有一个向向量添加元素的方法。
class PointerVector
{
public:
void addPointer(std::unique_ptr<int> p);
private:
std::vector<std::unique_ptr<int>> mPointers;
};
addPointer
方法定义:
void PointerVector::addPointer(std::unique_ptr<int> p)
{
mPointers.emplace_back(std::move(p));
}
所以我使用std::move
来转移指针的所有权。
当我致电addPointer
时,我也使用std::move
:
PointerVector pv;
std::unique_ptr<int> i(new i(1));
pv.addPointer(std::move(i));
这是正确的做事方式吗?感觉像是一直麻烦std::move
一样麻烦。
编辑:我实际上想要将一个unique_ptr的向量保存到类中,但我想先尝试使用int,以使事情变得更容易。
答案 0 :(得分:6)
几乎。在传递临时片段时,您不需要使用std::move()
,您的最后一个片段看起来会更好(如下所示)(我不会问您为什么需要将智能指针存储到int而不是int本身)。
PointerVector pv;
pv.addPointer(std::unique_ptr<int>(new int(1)));
答案 1 :(得分:1)
由于您正在使用emplace_back
直接在向量末尾的正确位置构建新的unique_ptr<int>
元素,因此最简单的解决方案是让您的PointerVector
类封装整个unique_ptr
管理逻辑,只需给它一个原始指针:
class PointerVector
{
public:
void addPointer(int* p);
private:
std::vector<std::unique_ptr<int>> mPointers;
};
void PointerVector::addPointer(int* p) {
assert(nullptr != p);
mPointers.emplace_back(p);
}
PointerVector pv;
pv.addPointer(new int(1));