dieses comment Inspired über Lambdas mit rvalue Referenzparameter direkt an std::async
, Binden eines rvalue zu einem Lambda durch std::async
Kompilierungen Bindung und führt wie erwartet: (live exampleUnterschied zwischen std :: async und std :: binden, wenn Umwickeln rvalue lambda Referenz
auto lambda = [] (std::string&& message) {
std::cout << message << std::endl;
};
auto future = std::async(lambda, std::string{"hello world"});
future.get();
std::bind
Verwendung, löst jedoch einen Compiler-Fehler: (live example)
auto lambda = [] (std::string&& message) {
std::cout << message << std::endl;
};
auto bound = std::bind(lambda, std::string{"hello world"}); // Compiler error
bound();
Dies liegt daran, std::bind
behält message
als Lvalue, so dass, wenn es an das Lambda übergeben wird, das Argument nicht mehr mit dem Parameter übereinstimmt.
Ich habe read dass std::async
intern std::bind
verwendet, so wie es mit rvalue Referenzparameter nicht weg, wenn std::bind
nicht der Fall ist? Gibt es einen bestimmten Teil des Standards, der dieses Verhalten erfordert oder vom Compiler abhängig ist?