std::async Launch Policies

What is the difference between std::launch::async and std::launch::deferred when passed to std::async?

A

They are identical: the launch policy is just a hint the implementation can ignore

B

async runs on a thread pool; deferred runs on the main thread

C

async guarantees the task runs on a new thread; deferred delays execution until get() or wait() is called on the future, running it on the calling thread

D

async is non-blocking; deferred blocks immediately until the task completes