Zainspirowany tym comment lambdy o wiązanie z parametrami odniesienia RValue bezpośrednio std::async
wiązanie rvalue do lambda przez std::async
kompiluje i wykonuje, jak oczekiwano (live example)Różnica std std :: asynchroniczny i :: wiążą podczas owijania RValue lambda odniesienia
auto lambda = [] (std::string&& message) {
std::cout << message << std::endl;
};
auto future = std::async(lambda, std::string{"hello world"});
future.get();
Korzystanie std::bind
jednak powoduje błąd kompilatora: (live example)
auto lambda = [] (std::string&& message) {
std::cout << message << std::endl;
};
auto bound = std::bind(lambda, std::string{"hello world"}); // Compiler error
bound();
to dlatego, std::bind
zachowuje message
jako lwartość, więc gdy przejdzie do lambda, argument nie będzie już odpowiadał parametrowi.
mam read że std::async
wewnętrznie używa std::bind
, tak jak to się uciec z parametrami odniesienia rvalue gdy std::bind
nie? Czy istnieje szczególna część normy, która wymaga tego zachowania, czy jest to zależne od kompilatora?