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中文網其他相關文章!