首頁 > 後端開發 > C++ > 我可以在 C 中回傳一個沒有 `std::move` 的 `std::unique_ptr` 嗎?

我可以在 C 中回傳一個沒有 `std::move` 的 `std::unique_ptr` 嗎?

Susan Sarandon
發布: 2024-12-15 02:42:09
原創
471 人瀏覽過

Can I Return a `std::unique_ptr` Without `std::move` in C  ?

在沒有std::move 的情況下傳回std::unique_ptr

在C 中,std::unique_ptr 強制執行移動語意以防止物件的多重所有權。但是,可以從函數傳回 unique_ptr,而不呼叫 std::move。此行為可歸因於稱為複製省略的語言功能。

複製省略

根據 C 語言規格(12.8 §34 和 §35),允許實現省略(省略) 滿足某些條件時的複製/移動操作。具體來說,在類別傳回類型的 return 語句中允許複製省略,前提是表達式是非揮發性自動物件的名稱,該物件的 cv 未限定類型與函數傳回類型相同。

省略在unique_ptr 返回語句

您提供的範例程式碼中:

unique_ptr<int> foo()
{
  unique_ptr<int> p(new int(10));
  return p;  // Line 1
}
登入後複製

p 是一個非揮發性自動對象,與函數返回類型具有相同的類型unique_ptr。因此,編譯器可以省略 p 的複製構造。

當編譯器遇到第 1 行時,它首先執行重載解析來選擇複製操作的建構函數,就好像 p 是由右值指定的一樣。然而,由於滿足了省略的標準,複製構造被省略,傳回的值成為移出的 unique_ptr。

對最佳實踐的影響

需要注意的是按值返回在這種情況下應該是預設選擇。在存在複製省略的情況下,return 語句中的命名值將被視為右邊值。這意味著即使沒有明確使用 std::move,傳回的 unique_ptr 也可以從函數的臨時物件中移動。

透過引用回傳或使用 std::make_unique 都是避免複製省略並確保顯式的可行替代方案所有權轉讓。

以上是我可以在 C 中回傳一個沒有 `std::move` 的 `std::unique_ptr` 嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板