![](/img/trans.png)
[英]Why does std::get not have a single signature that accepts a forwarding reference
[英]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.