将unique_ptr传递给将其添加到向量的函数

时间:2014-02-17 10:35:11

标签: c++ c++11 vector unique-ptr

我有一个包含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,以使事情变得更容易。

2 个答案:

答案 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));