2015-12-08 112 views
0

我想用另一个替换该索引处的unique_ptr对象,这实质上是“删除”了当前在该向量中的指针,并将classObj移动到该位置。用另一个unique_ptr替换vector中的unique_ptr对象

std::unique_ptr<ClassName> classObj(new className()); 
classNameStorage[5] = classObj; // classNameStorage.size() > 5 

上面的代码,使用赋值运算符是无效的。

+0

可能的重复[为什么我不推送\ _返回一个唯一的\ _ptr成矢量?](http://stackoverflow.com/questions/3283778/why-can-i-not-push-back-a- unique-ptr-into-a-vector) –

+0

在旁注上,第一行可以表示为auto classObj = std :: make_unique ()'。根据Scott Meyers的说法,'std :: make_unique'(除了输入较少)的优点是它确保'unique_ptr'在实例化'T'时立即拥有所有权。这对于更复杂的表达以及存在例外的情况有所不同。编译器首先评估'new T',然后评估'x(std :: unique_ptr (new T),y())',然后评估''()',然后评估前者的'unique_ptr'构造函数。在这种情况下,来自'y()'的throw将会泄漏一个'T'。 – user4815162342

+0

classNameStorage的类型是什么? –

回答

4

classNameStorage[5] = std::move(classObj);

std::unique_ptr是唯才是举类。因此,在实例具有名称的情况下(即左值),必须将其包装在std::move(“转换”为右值)以将数据移出。

请参阅here了解更多详情。