包装rvalue引用lambda时std :: async和std :: bind之间的区别

时间:2015-05-06 19:29:18

标签: c++ c++11 lambda rvalue-reference stdbind

受此comment的启发,关于将rvalue引用参数直接绑定到std::async的lambdas,通过std::async将rvalue绑定到lambda并按预期执行: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::bindmessage保留为左值,因此当它传递给lambda时,参数不再与参数匹配。

std::async std::bind内部使用std::bind,那么当field: 'name', filter: { condition: function(searchTerm, cellValue) { var strippedValue = (searchTerm).split(';'); //console.log(strippedValue); for (i = 0; i < strippedValue.length; i++){ if (cellValue.indexOf(strippedValue[i]) == -1) return false; return true; } //return cellValue.indexOf(strippedValue) >= 0; } }, headerCellClass: $scope.highlightFilteredHeader 没有时,如何使用右值参考参数?是否存在需要此行为的标准的特定部分,或者这取决于编译器?

1 个答案:

答案 0 :(得分:4)

  

read那个   std::async内部使用std::bind,因此如何逃脱   std::bind没有时的右值参考参数?

内部不使用bind。 (或者更确切地说,它不能不经历像@Praetorian's answer in that question中那样的史诗扭曲,而且单独写一些东西要容易得多。)

它通常使用类似bind的机制实现,但它更简单,因为它不必处理各种奇怪的事情bind句柄(嵌套bind s ,占位符,删除额外的论点等。)

  

是否存在需要此行为的标准的特定部分   或者这取决于编译器?

这是标准所要求的。 bind的规范非常密集,但是需要将普通绑定参数作为左值传递([func.bind.bind] / p10,bullet 4)。

指定

async来调用INVOKE (DECAY_COPY (std::forward<F>(f)), DECAY_COPY (std::forward<Args>(args))...)DECAY_COPY始终返回右值。