據我所知,auto_ptr不能與矢量一起使用,因爲auto_ptr不符合作爲可複製構造的要求。由於被複制的auto_ptr被修改,因此複製不會導致兩個完全相同的副本,從而違反了可複製構造方式。爲什麼unique_ptr可以用於std容器,vector <>例如?
Unique_ptr也似乎也這樣做;它修改被複制的對象 - 被複制對象的指針成員被設置爲nullptr。 那麼,怎麼可能使用uinque_ptr與矢量而不是auto_ptrs?
我的理解是否正確或我在這裏錯過了什麼?
auto_ptr <int> autoPtr(new int);
vector < auto_ptr <int> > autoVec;
autoVec.push_back(autoPtr); //compiler error..why?
unique_ptr <int> uniquePtr(new int);
vector < unique_ptr <int> > uniqueVec;
uniqueVec.push_back(std::move(uniquePtr)); //okay..why?
[所以你不能複製它](http://coliru.stacked-crooked.com/a/495f091f798712ab),[但你可以移動它](http://coliru.stacked-crooked.com/ a/361fc294fb13279d) – 2015-02-24 05:01:16
@VxxGxx這只是'auto_ptr'不能提供任何防止被嘗試複製清除的保護。此外,'auto_ptr'已棄用。不過,這至少會給你一個警告。 – 2015-02-24 06:34:03
@BryanChen我們可以拷貝(通過auto_ptr中的非const引用)或者移動它(通過右值引用),被拷貝的對象被改變。這違反了複製構造的習慣用法。那麼是什麼讓unique_ptr適合像vector這樣的容器而不是auto_ptr? – Vishal 2015-02-24 08:18:35