std :: bind和std :: thread总是复制参数的基本原理是什么?

rya*_*ner 10 c++ stl c++11

众所周知,std :: bind和std :: thread的默认行为是它将复制(或移动)传递给它的参数,并且使用引用语义我们将不得不使用引用包装器.

  1. 有谁知道为什么这会产生良好的默认行为?ESP.在带有右值引用和完美转发的C++ 11中,在我看来,完全转发参数更有意义.

  2. std :: make_shared虽然并不总是复制/移动,但只是完全转发提供的参数.为什么这里有两种看似不同的转发参数行为?(std :: thread和std :: bind总是复制/移动vs std :: make_shared不会)

n. *_* m. 13

make_shared转发到现在正在调用的构造函数.如果构造函数使用call by reference语义,它将获得引用; 如果它按值调用,它将复制.这两种方式都没问题.

bind当本地上下文可能消失时,会创建对将来某些未知点调用的函数的延迟调用.如果bind使用完美转发,则必须复制通常由引用发送但在实际调用时不知道存在的参数,将它们存储在某处并管理该存储.用当前的语义bind为你做.


Nic*_*las 7

对于这两个std::bindstd::thread,从调用站点推迟对给定参数的函数调用.在这两种情况下,确切地调用函数的时间都是未知的.

在这种情况下直接转发参数将需要存储引用.这可能意味着存储对堆栈对象的引用.实际执行呼叫时可能不存在.

哎呀.

Lambdas可以做到这一点,因为你有能力在每次捕获的基础上决定是否要通过引用或值来捕获.使用std::ref,您可以通过引用绑定参数.