Was ist der Unterschied zwischen packaged_task und async?

Bei der Arbeit mit dem Thread-Modell von C ++ 11 ist mir das aufgefallen

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';

und

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

scheinen genau das gleiche zu tun. Ich verstehe, dass es einen großen Unterschied geben könnte, wenn ich rennestd::async mitstd::launch::deferred, aber gibt es in diesem Fall eine?

Was ist der Unterschied zwischen diesen beiden Ansätzen und was noch wichtiger ist, in welchen Anwendungsfällen sollte ich einen über den anderen setzen?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage