在C 中,std::unique_ptr 強制執行移動語意以防止物件的多重所有權。但是,可以從函數傳回 unique_ptr,而不呼叫 std::move。此行為可歸因於稱為複製省略的語言功能。
根據 C 語言規格(12.8 §34 和 §35),允許實現省略(省略) 滿足某些條件時的複製/移動操作。具體來說,在類別傳回類型的 return 語句中允許複製省略,前提是表達式是非揮發性自動物件的名稱,該物件的 cv 未限定類型與函數傳回類型相同。
您提供的範例程式碼中:
unique_ptr<int> foo() { unique_ptr<int> p(new int(10)); return p; // Line 1 }
p 是一個非揮發性自動對象,與函數返回類型具有相同的類型unique_ptr
當編譯器遇到第 1 行時,它首先執行重載解析來選擇複製操作的建構函數,就好像 p 是由右值指定的一樣。然而,由於滿足了省略的標準,複製構造被省略,傳回的值成為移出的 unique_ptr。
需要注意的是按值返回在這種情況下應該是預設選擇。在存在複製省略的情況下,return 語句中的命名值將被視為右邊值。這意味著即使沒有明確使用 std::move,傳回的 unique_ptr 也可以從函數的臨時物件中移動。
透過引用回傳或使用 std::make_unique 都是避免複製省略並確保顯式的可行替代方案所有權轉讓。
以上是我可以在 C 中回傳一個沒有 `std::move` 的 `std::unique_ptr` 嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!