auto_ptr 絕不能放入 STL 容器:標準禁止的深層原因C++ 標準**明確禁止**包含 auto_ptr 的容器 (COAPs)。合規編譯器應拒絕編譯此類代碼。但許多舊版 STL 實現未強制檢查,導致開發者誤以為可用。
auto_ptr 複製建構/賦值會**轉移擁有權**,來源歸零:
auto_ptr pw1(new Widget);
auto_ptr pw2(pw1); // pw1 變 null,pw2 擁有 Widget
這違反 STL 容器要求的「複製語義」(複製後兩者獨立、等價)。
sort 算法實例vector<auto_ptr<Widget>> v 呼叫 sort(v.begin(), v.end(), cmp) 時:
sort 內部實現(快排)需複製元素到暫存變數 pivotValue:ElementType pivotValue(*i); // 複製 auto_ptr → 來源變 null,Widget 被 deleteauto_ptr 語義根本與容器需求衝突,無法修補。shared_ptr/unique_ptr)。unique_ptr:移動語義、可放入容器(需 move)、支援陣列、零開銷。shared_ptr:共享擁有權、標準複製語義、完美支援容器。shared_ptr/scoped_ptr:C++03 專案的最佳選擇。auto_ptr 進容器是**定時炸彈**。標準禁止非草率,而是基於語義不相容的鐵律。請立即遷移至現代智慧指標。