更多 C++ 慣用法/Const auto 指標
外觀
防止持有資源的所有權轉移。注意:auto_ptr 已被棄用,並在 C++11 中被 shared_ptr、unique_ptr 和 weak_ptr 取代,因此不再建議使用此慣用法。
通常,需要在程式碼中強制執行不可轉移所有權的設計決策,並藉助編譯器來強制執行它。此處考慮的所有權是指任何資源的所有權,例如記憶體、資料庫連線等。如果我們不希望獲取的資源的所有權在作用域之外或從一個物件轉移到另一個物件,則可以使用 const auto_ptr 慣用法。
沒有 cv 限定符(const 和 volatile 的正式名稱)的 auto_ptr 具有 移動建構函式慣用法 中描述的移動語義。它基本上意味著記憶體的所有權將無條件地從賦值運算子右側物件轉移到左側物件,但這確保了資源始終只有一個所有者。const auto_ptr 可以防止這種轉移。
將儲存記憶體資源的 auto_ptr 宣告為 const。
const auto_ptr <X> xptr (new X());
auto_ptr <X> yptr (xptr); // Not allowed, compilation error.
xptr.release(); // Not allowed, compilation error.
xptr.reset( new X() ); // Not allowed, compilation error.
編譯器在這裡發出警告,因為 yptr 的複製建構函式並不是真正的複製建構函式,實際上它是一個移動建構函式,它接受對 auto_ptr 的非 const 引用,如 移動建構函式慣用法 中所述。非 const 引用不能與 const 變數繫結,因此編譯器會標記錯誤。
- const auto_ptr 慣法的一個不利後果是,編譯器無法為包含 const auto_ptr 成員的類提供預設的複製建構函式。這是因為編譯器生成的複製建構函式始終接受 const RHS 作為引數,它不能與 auto_ptr 的非 const 移動建構函式繫結。解決方法是使用 虛擬建構函式 慣用法,或使用 boost::scoped_ptr,它透過禁止訪問賦值運算子和複製建構函式來明確禁止複製。