在沒有 std::move 的情況下回傳 std::unique_ptr:怎麼可能?
儘管 std:: 中禁止複製構造unique_ptr
例外:複製省略
C 允許在特定情況下進行複製省略,如中定義12.8 第 34 條和第 35 條。其中一種情況是傳回與函數傳回類型具有相同 cv 未限定類型的非揮發性自動物件。在這種情況下,編譯器可以省略複製構造過程。這種省略適用於複製和移動。
複製省略的實作
當在return 語句中使用複製省略時,編譯器首先將物件視為一個右值,即使它是一個左值,用於重載解析的目的。因此,如果移動建構函數可用,則會選擇它,但不執行實際的移動操作。這會導致空的移動構造函數調用,充當佔位符並維護唯一指針的所有權語義。
範例
以下程式碼示範了這個現象:
unique_ptr<int> foo() { unique_ptr<int> p( new int(10) ); return p; // Line 1, copy elision applied } int main() { unique_ptr<int> p = foo(); cout << *p << endl; return 0; }
第1 行,回傳的unique_ptr
結論
C 語言規範特別允許複製構造函數禁止的這種例外,以促進高效和簡潔的返回語句。但是,請務必注意,複製省略是編譯器可能執行也可能不執行的最佳化。因此,通常建議在 return 語句中明確使用 std::move 以確保預期的行為。
以上是如何在不使用'std::move”的情況下返回'std::unique_ptr”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!