受此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::bind
将message
保留为左值,因此当它传递给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
没有时,如何使用右值参考参数?是否存在需要此行为的标准的特定部分,或者这取决于编译器?
答案 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
始终返回右值。