簡體   English   中英

為什么std :: thread通過轉發引用接受仿函數

[英]Why std::thread accepts a functor by forwarding reference

為什么std::thread對象通過轉發引用接受函數參數,然后使用decay_copy對象的副本? 按值接受函數對象會不會更容易?

一般來說為什么不模擬函數以便按值獲取函數對象? 可以使用reference_wrapper (它更明確,並且還方便地使用成員operator()來調用存儲的函數)來引用-inss;

為什么std::thread對象通過轉發引用接受函數參數,然后使用decay_copy創建對象的副本? 按值接受函數對象會不會更容易?

它必須在存儲中有一個功能對象的副本,只要它即將啟動的線程持續,它就可以保證持續。

構造std::thread函數參數不會持續那么長,因為創建std::thread的行可以在創建的線程結束之前很久就結束。

所以它必須復制。 如果它使用其參數by-value,它將在調用構造函數時創建一個副本,然后必須另外復制到持久存儲。 通過轉發引用來獲取它,它只生成一個副本。

現在可以移動這個額外的副本,使額外的開銷增加一個額外的動作。 這仍然是額外的開銷,因為並非所有構造都移動便宜。

一般來說為什么不模擬函數以便按值獲取函數對象?

因為這要求額外的move

可以使用reference_wrappers(它更明確,並且還方便地使用成員operator()來調用存儲的函數)來引用-inss;

在您打算存儲函數對象的情況下,通過轉發引用來保存移動,並且在獲取代碼的函數對象的編寫器方面不需要額外的工作。

如果調用者傳入了引用包裝器,則存儲的值將是引用包裝器,它具有不同的含義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM