为什么 std::thread 通过转发引用接受函子
Why std::thread accepts a functor by forwarding reference
为什么std::thread
对象通过转发引用接受函数参数,然后用decay_copy
复制对象?只按值接受函数对象不是更容易吗?
一般来说,为什么不对函数进行模板化以便按值获取函数对象? reference_wrapper
s 不能模仿引用性吗(这会更明确,而且有一个成员 operator()
可以方便地调用存储函数)?
Why does a std::thread
object accept the function parameter by forwarding reference and then make a copy of the object with decay_copy? Wouldn't it be easier to just accept the function object by value?
它必须在存储中有一个函数对象的副本,它可以保证只要它即将启动的线程持续存在就持续存在。
构造 std::thread
的函数参数不会持续那么久,因为创建 std::thread
的行可以在创建的线程结束之前很久就结束。
所以它必须复制。如果它按值获取参数,它会在调用构造函数时制作一个副本,然后必须制作 另一个 副本到持久存储。通过转发引用,它使 正好成为一个 副本。
现在可以移动这个额外的副本,使额外的开销成为一个额外的移动。这仍然是额外的开销,因为并非所有结构的移动成本都很低。
In general why would one not template a function so as to take a function object by value?
因为这需要额外的 move
。
Can reference-ness not be imitated with reference_wrappers (which would be more explicit, and also conveniently has a member operator() to call the stored function)?
在您打算存储函数对象的情况下,通过转发引用来获取节省了一步,并且不需要函数对象获取代码的编写者做太多额外的工作。
如果调用者传入引用包装器,则存储的值将是引用包装器,这具有不同的含义。
为什么std::thread
对象通过转发引用接受函数参数,然后用decay_copy
复制对象?只按值接受函数对象不是更容易吗?
一般来说,为什么不对函数进行模板化以便按值获取函数对象? reference_wrapper
s 不能模仿引用性吗(这会更明确,而且有一个成员 operator()
可以方便地调用存储函数)?
Why does a
std::thread
object accept the function parameter by forwarding reference and then make a copy of the object with decay_copy? Wouldn't it be easier to just accept the function object by value?
它必须在存储中有一个函数对象的副本,它可以保证只要它即将启动的线程持续存在就持续存在。
构造 std::thread
的函数参数不会持续那么久,因为创建 std::thread
的行可以在创建的线程结束之前很久就结束。
所以它必须复制。如果它按值获取参数,它会在调用构造函数时制作一个副本,然后必须制作 另一个 副本到持久存储。通过转发引用,它使 正好成为一个 副本。
现在可以移动这个额外的副本,使额外的开销成为一个额外的移动。这仍然是额外的开销,因为并非所有结构的移动成本都很低。
In general why would one not template a function so as to take a function object by value?
因为这需要额外的 move
。
Can reference-ness not be imitated with reference_wrappers (which would be more explicit, and also conveniently has a member operator() to call the stored function)?
在您打算存储函数对象的情况下,通过转发引用来获取节省了一步,并且不需要函数对象获取代码的编写者做太多额外的工作。
如果调用者传入引用包装器,则存储的值将是引用包装器,这具有不同的含义。