2856. std::async should be marked as [[nodiscard]]

Section: 33.6.9 [futures.async] Status: New Submitter: Andrey Davydov Opened: 2017-01-20 Last modified: 2017-07-14

Priority: 2

View other active issues in [futures.async].

View all other issues in [futures.async].

View all issues with New status.

Discussion:

Because the destructor of the std::future returned from the std::async blocks until the asynchronous operation completes, discarding the std::async return value leads to the synchronous code execution, which is pointless. For example, in the following code

void task1();
void task2();

void foo()
{
  std::async(std::launch::async,  task1),
  std::async(std::launch::async,  task2);
}

void bar()
{
  std::async(std::launch::async,  task1);
  std::async(std::launch::async,  task2);
}

task1 and task2 will be concurrently executed in the function 'foo', but sequentially in the function 'bar'.

[2017-01-27 Telecon]

Priority 2; Nico to provide wording.

[2017-03-04, Kona]

This should be handled by Nico's paper P0600.

Proposed resolution: