众所周知,std :: bind和std :: thread的默认行为是它将复制(或移动)传递给它的参数,并且使用引用语义我们将不得不使用引用包装器.
有谁知道为什么这会产生良好的默认行为?ESP.在带有右值引用和完美转发的C++ 11中,在我看来,完全转发参数更有意义.
std :: make_shared虽然并不总是复制/移动,但只是完全转发提供的参数.为什么这里有两种看似不同的转发参数行为?(std :: thread和std :: bind总是复制/移动vs std :: make_shared不会)
n. *_* m. 13
make_shared
转发到现在正在调用的构造函数.如果构造函数使用call by reference语义,它将获得引用; 如果它按值调用,它将复制.这两种方式都没问题.
bind
当本地上下文可能消失时,会创建对将来某些未知点调用的函数的延迟调用.如果bind
使用完美转发,则必须复制通常由引用发送但在实际调用时不知道存在的参数,将它们存储在某处并管理该存储.用当前的语义bind
为你做.
对于这两个std::bind
和std::thread
,从调用站点推迟对给定参数的函数调用.在这两种情况下,确切地调用函数的时间都是未知的.
在这种情况下直接转发参数将需要存储引用.这可能意味着存储对堆栈对象的引用.实际执行呼叫时可能不存在.
哎呀.
Lambdas可以做到这一点,因为你有能力在每次捕获的基础上决定是否要通过引用或值来捕获.使用std::ref
,您可以通过引用绑定参数.
归档时间: |
|
查看次数: |
1646 次 |
最近记录: |