为什么一个std::thread
对象通过转发引用接受函数参数,然后用decay_copy
?复制该对象?按值接受函数对象会不会更容易?
一般来说为什么不模拟函数以便按值获取函数对象?可以引用 - 不能用reference_wrapper
s 模仿(这将更明确,并且还方便地有一个成员operator()
来调用存储的函数)?
为什么
std::thread
对象通过转发引用接受函数参数,然后使用decay_copy复制对象?按值接受函数对象会不会更容易?
它必须在存储中有一个功能对象的副本,只要它即将启动的线程持续,它就可以保证持续.
构造的函数参数std::thread
不会持续那么长,因为std::thread
创建的行可以在创建的线程结束之前很久结束.
所以它必须复制.如果它使用其参数by-value,它将在调用构造函数时创建一个副本,然后必须另外复制到持久存储.通过转发引用来获取它,它只生成一个副本.
现在可以移动这个额外的副本,使额外的开销增加一个额外的动作.这仍然是额外的开销,因为并非所有构造都移动便宜.
一般来说为什么不模拟函数以便按值获取函数对象?
因为这要求额外的move
.
可以使用reference_wrappers(它更明确,并且还方便地使用成员operator()来调用存储的函数)来引用-inss;
在您打算存储函数对象的情况下,通过转发引用来保存移动,并且在获取代码的函数对象的编写器方面不需要额外的工作.
如果调用者传入了引用包装器,则存储的值将是引用包装器,它具有不同的含义.