std::unique_ptr
考慮以下程式碼片段:
unique_ptr<int> foo() { unique_ptr<int> p(new int(10)); return p; // Line 1 } int main() { unique_ptr<int> p = foo(); cout << *p << endl; }
第 1 行回傳一個不帶 std::move() 的 unique_ptr。令人驚訝的是,程式碼按預期編譯和運行,那麼在不呼叫複製構造函數的情況下,這怎麼可能呢?
理解這種行為的關鍵在於 C 語言規範。具體來說,第 12.8 節 §34 和 §35 描述了複製省略:
當滿足某些條件時,允許實現省略類別物件的複製/移動構造 [...]。
在這種情況下,複製省略是允許的,因為:
當滿足複製操作的省略條件並且要複製的物件由首先執行左值,為副本選擇構造函數的重載決策,就像該物件是由右值指定的一樣。
這表示雖然傳回值是命名物件(左值),重載決議仍將其視為右值。因此,不會呼叫 move 建構函數,並且成功地建構了傳回的 unique_ptr。
無需 std::move() 返回 unique_ptr 的能力是 C 語言的一個微妙功能語言規範。從函數傳回 unique_ptr 時,不必明確使用 std::move(),只要滿足複製省略的條件即可。這有助於提高程式碼清晰度並減少不必要的移動操作。
以上是為什麼回傳`std::unique_ptr`不需要`std::move()`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!