为什么std::thread通过转发引用接受一个函子

Why std::thread accepts a functor by forwarding reference

本文关键字:一个 thread std 引用 转发 为什么      更新时间:2023-10-16

为什么std::thread对象通过转发引用接受函数参数,然后用decay_copy复制对象?只接受函数对象的值不是更容易吗?

一般来说,为什么不将函数模板化,以便按值获取函数对象?引用性可以不用reference_wrapper s模仿吗?(它会更明确,也方便地有一个成员operator()来调用存储的函数)?

为什么std::thread对象通过转发引用接受函数参数,然后用decay_copy复制对象?只接受函数对象的值不是更容易吗?

它必须在存储中有一个函数对象的副本,它可以保证它将要启动的线程持续多久。

构造std::thread的函数参数不会持续那么长时间,因为创建std::thread的行可能在创建的线程结束之前很久就结束了。

所以它必须复制。如果它按值获取参数,它将在调用构造函数时生成一个副本,然后必须将另一个副本复制到持久存储。通过转发引用获取它,它使正好成为一个副本。

现在,这个额外的副本可以移动到,使额外的开销增加一步。这仍然是额外的开销,因为并不是所有的结构都是廉价的。

一般来说,为什么不将函数模板化,以便按值获取函数对象?

因为这需要额外的move

引用可以不使用reference_wrappers来模仿吗(它会更显式,而且还方便地有一个成员运算符()来调用存储的函数)?

在打算存储函数对象的情况下,通过转发引用获取可以保存移动,并且不需要函数对象获取代码的编写者做太多额外的工作。

如果调用方传入引用包装,则存储的值将是引用包装,这具有不同的含义。