首先,我创建一个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”的匹配函数
如果您想要一个<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);
}
}