std::async 和 std::bind 包装右值引用 lambda 时的区别
Difference between std::async and std::bind when wrapping rvalue reference lambda
受此启发 about binding lambdas with rvalue reference parameters directly to std::async
, binding an rvalue to a lambda through std::async
compiles and executes as expected: (live example)
auto lambda = [] (std::string&& message) {
std::cout << message << std::endl;
};
auto future = std::async(lambda, std::string{"hello world"});
future.get();
但是,使用 std::bind
会触发编译器错误:(live example)
auto lambda = [] (std::string&& message) {
std::cout << message << std::endl;
};
auto bound = std::bind(lambda, std::string{"hello world"}); // Compiler error
bound();
这是因为 std::bind
将 message
保留为左值,因此当它传递给 lambda 时,参数不再匹配参数。
我 read std::async
在内部使用 std::bind
,那么当 std::bind
不使用右值引用参数时,它是如何逃脱的?标准中是否有特定部分需要这种行为,或者这取决于编译器?
I've read that
std::async
internally uses std::bind
, so how does it get away with
rvalue reference parameters when std::bind
does not?
它不在内部使用 bind
。 (或者更确切地说,它不可能不经历一些像 中那样的史诗般的扭曲,而且单独写一些东西要容易得多)。
它通常使用某种类似于 bind
的机制来实现,但它要简单得多,因为它不必处理各种奇怪的事情 bind
句柄(嵌套 bind
s,占位符,删除额外的参数等)
Is there a particular part of the standard that requires this behavior
or is this dependent on the compiler?
标准要求。 bind
的规范非常密集,但确实需要将纯绑定参数作为左值传递([func.bind.bind]/p10,第 4 条)。
async
指定调用 INVOKE (DECAY_COPY (std::forward<F>(f)),
DECAY_COPY (std::forward<Args>(args))...)
,并且 DECAY_COPY
总是 returns 一个右值。
受此启发std::async
, binding an rvalue to a lambda through std::async
compiles and executes as expected: (live example)
auto lambda = [] (std::string&& message) {
std::cout << message << std::endl;
};
auto future = std::async(lambda, std::string{"hello world"});
future.get();
但是,使用 std::bind
会触发编译器错误:(live example)
auto lambda = [] (std::string&& message) {
std::cout << message << std::endl;
};
auto bound = std::bind(lambda, std::string{"hello world"}); // Compiler error
bound();
这是因为 std::bind
将 message
保留为左值,因此当它传递给 lambda 时,参数不再匹配参数。
我 read std::async
在内部使用 std::bind
,那么当 std::bind
不使用右值引用参数时,它是如何逃脱的?标准中是否有特定部分需要这种行为,或者这取决于编译器?
I've read that
std::async
internally usesstd::bind
, so how does it get away with rvalue reference parameters whenstd::bind
does not?
它不在内部使用 bind
。 (或者更确切地说,它不可能不经历一些像
它通常使用某种类似于 bind
的机制来实现,但它要简单得多,因为它不必处理各种奇怪的事情 bind
句柄(嵌套 bind
s,占位符,删除额外的参数等)
Is there a particular part of the standard that requires this behavior or is this dependent on the compiler?
标准要求。 bind
的规范非常密集,但确实需要将纯绑定参数作为左值传递([func.bind.bind]/p10,第 4 条)。
async
指定调用 INVOKE (DECAY_COPY (std::forward<F>(f)),
DECAY_COPY (std::forward<Args>(args))...)
,并且 DECAY_COPY
总是 returns 一个右值。