首頁 > 後端開發 > C++ > 為什麼 std::thread 即使在按引用傳遞時也會呼叫複製建構函式?

為什麼 std::thread 即使在按引用傳遞時也會呼叫複製建構函式?

Linda Hamilton
發布: 2024-11-16 15:22:03
原創
187 人瀏覽過

Why Does std::thread Call the Copy Constructor Even When Passing by Reference?

std::thread 在按引用傳遞時呼叫複製建構子

使用std::thread 將資料傳遞到執行緒可能會出現問題,尤其是在處理禁用複製建構函數的類別時。此行為源自於 std::thread 按值取得其參數的事實。

考慮以下帶有禁用複製建構函數的Log 類別:

在main 函數中,Log物件記錄器透過引用傳遞給伺服器函數:

伺服器函數然後建立一個新線程,其中記錄器作為argument:

但是,由於Log 中停用了複製建構函數,這會導致編譯器錯誤。

為什麼會依照引用傳遞會呼叫複製建構子?

與常見的假設相反,在 C 中按引用傳遞不會阻止複製構造函數的呼叫。傳遞參考時,編譯器會建立所引用物件的臨時副本並將其傳遞給函數。這是因為 std::thread 期望其參數是可複製的。

解決方案:使用std::reference_wrapper

要在這個情況下實作引用語義,您可以使用std::reference_wrapper:

std::ref 以某種方式包裝引用,使得它顯示為std::thread 的可複製物件。但是,您必須確保底層物件(在本例中為記錄器)的生命週期超出執行緒的生命週期。

以上是為什麼 std::thread 即使在按引用傳遞時也會呼叫複製建構函式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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