Jaka jest różnica między maskowanym_zadaniem a asynchronicznym

Podczas pracy z gwintowanym modelem C ++ 11 zauważyłem to

std::packaged_task<int(int,int)> task([](int a, int b) { return a + b; });
auto f = task.get_future();
task(2,3);
std::cout << f.get() << '\n';

i

auto f = std::async(std::launch::async, 
    [](int a, int b) { return a + b; }, 2, 3);
std::cout << f.get() << '\n';

wydają się robić dokładnie to samo. Rozumiem, że jeśli ucieknę, może być duża różnicastd::async zstd::launch::deferred, ale czy w tym przypadku jest jeden?

Jaka jest różnica między tymi dwoma podejściami, a co ważniejsze, w jakich przypadkach należy użyć jednego nad drugim?

questionAnswers(3)

yourAnswerToTheQuestion