C 11 中移出物件的有效性
當物件從C 11 移出時,其狀態變得未指定,引發問題關於之後可以對其執行哪些操作。雖然標準庫類型會移至有效但未指定的狀態,但自訂類型需要明確定義才能確定其移動後的有效狀態。
對於 pimpl 對象,其實現隱藏在指針後面,問題出現了:一旦 Foo 對象的 pimpl 指針被移走,可以對它做什麼?雖然銷毀或重新分配移出的物件仍然是安全的,但嘗試像 do_stuff 這樣的操作將會失敗,因為 pimpl 指標已變得無效。
標準設計鼓勵採用保守的方法,允許啟用移出的物件的未指定狀態跨不同程式庫的高效實施。這需要在對物件執行操作之前查詢其狀態,這項任務可能會帶來效能開銷,尤其是在移動操作頻率較高的場景中。
為了避免此類查詢,可以使用自訂類型明確指定其移出後的有效狀態。例如,pimpl 類別可以聲明從它移動會使 do_stuff 無效並具有未定義的行為。這種方法可確保使用者了解從物件移出可能產生的後果,並避免潛在的錯誤。
值得注意的是,移出的物件仍然必須滿足標準庫定義的任何概念的要求,這不考慮移出狀態。因此,不維護相關概念定義的有效狀態的自訂類型不能與標準庫一起使用,否則會帶來未定義行為的風險。
以上是在 C 11 中可以對移出的物件做什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!