提问者:小点点

将对象从unique_ptr数组移动到vector


首先,我创建一个Foo对象的unique_ptr数组。然后我将对象移动到一个向量,如下面的代码所示。但是这个代码不能编译。另一个问题是,由于对象是使用新运算符的数组版本分配的。如果发生异常,程序必须在我将对象移动回unique_ptr数组之前提前终止,会发生什么?在这种情况下,向量vec将使用删除运算符而不是删除运算符的数组版本销毁其内容?我们如何解决这种问题?

class Foo
{
public:
  int id;

  Foo(){};
};

int main()
{
  int n = 10;

  std::unique_ptr<Foo []> fooarr(new Foo[n]);

  std::vector<std::unique_ptr<Foo>> vec;

  for( int i=0 ; i<n ; i++ ){
    fooarr[i].id = i;
  }

  for( int i=0 ; i<n ; i++ ){
    vec.push_back( std::move(fooarr[i]) );
  }

  //then move back the Foo objects from vec to fooarr

}

这是我从编译器那里得到的。

main.cpp:在函数“int main()”中:main.cpp:47:错误:没有用于调用“std::vector”的匹配函数


共2个答案

匿名用户

如果您想要一个<code>std::vector

for( int i=0 ; i<n ; i++ ){
  vec.push_back( std::make_unique<Foo>(std::move(fooarr[i])) );
}

匿名用户

正如另一个答案所说,如果你想把Foo放入vec,你应该调用make_unique

Below is the complete implementation   
class Foo
{
public:
  int id;
  Foo() {};
};
int main()
{
  int n = 10;
  std::unique_ptr<Foo[]> fooarr(new Foo[n]);
  std::vector<std::unique_ptr<Foo>> vec;
  for (int i = 0; i < n; i++)fooarr[i].id = i;
  for (int i = 0; i < n; i++) vec.push_back(make_unique<Foo>(std::move(fooarr[i])));  
  //then move back the Foo objects from vec to fooarr
  for (int i = 0; i < n; ++i) {
    fooarr[i] = *vec[i].release();
    assert(vec[i] == nullptr);  
  }
}