spunto da questo comment merito lambda con parametri di riferimento rvalue legandosi direttamente al std::async
, associare un rvalue ad un lambda attraverso std::async
compila ed esegue come previsto: (live example)Differenza tra std :: asincrono e std :: bind quando l'involucro rvalue riferimento lambda
auto lambda = [] (std::string&& message) {
std::cout << message << std::endl;
};
auto future = std::async(lambda, std::string{"hello world"});
future.get();
Utilizzando std::bind
, però, innesca un errore di compilazione: (live example)
auto lambda = [] (std::string&& message) {
std::cout << message << std::endl;
};
auto bound = std::bind(lambda, std::string{"hello world"}); // Compiler error
bound();
Questo perché std::bind
mantiene message
come un lvalue, in modo che quando lo passa al lambda, l'argomento non corrisponde più al parametro.
ho read che std::async
utilizza internamente std::bind
, così come si ottiene via con parametri di riferimento rvalue quando std::bind
non lo fa? Esiste una parte particolare dello standard che richiede questo comportamento o dipende dal compilatore?