首頁 >後端開發 >C++ >為什麼「std::thread」在透過引用傳遞參數時不繞過複製建構子?

為什麼「std::thread」在透過引用傳遞參數時不繞過複製建構子?

DDD
DDD原創
2024-11-27 12:04:09957瀏覽

Why Does `std::thread` Not Bypass Copy Constructors When Passing Arguments by Reference?

std::thread 與複製建構子:理解傳遞參考難題

std::thread,現代的一個組成部分C 的多線程功能在透過引用傳遞物件時出現了困境。這是由於語言處理引用的方式和 std::thread 處理其參數的方式之間存在根本差異。

透過引用傳遞物件時,我們希望繞過複製建構函數,因為引用充當原始物件的別名。然而,這個假設對於 std::thread 並不成立。原因如下。

std::thread 的參數處理

與我們的期望相反,std::thread 按值傳遞其參數。聲明函數對象,接受與執行緒相同的參數,然後使用提供的參數進行呼叫。這意味著每個參數都會被複製到函數物件中,即使它作為引用傳遞也是如此。

私有複製建構函式和失敗的編譯

在提供的程式碼中, Log 類別有意透過將其設為私有來停用複製建構函式。當 std::thread 嘗試將記錄器複製到函式物件中時,它會觸發編譯錯誤,因為私有複製建構子無法存取。

使用 std::reference_wrapper 解決問題

為了在將參數傳遞給 std::thread 時重新獲得引用語義,我們可以使用 std::reference_wrapper。使用 std::reference_wrapper 包裝參考可確保函數物件接收原始物件的引用,從而避免值複製的陷阱。

使用std::reference_wrapper 的程式碼

std::thread newThread(session, &sock, std::ref(logger));

在這個修正的範例中,編譯器能夠正確建立std::thread 對象,因為記錄器現在包裝在std::reference_wrapper,保留其引用狀態。

以上是為什麼「std::thread」在透過引用傳遞參數時不繞過複製建構子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn