o comportamento de std :: async com std :: launch :: async policy

Tenho alguma dúvida sobre o comportamento destd::async função comstd::launch::async policy &std::future objeto retornado de assíncron

No código a seguir, o encadeamento principal aguarda a conclusão defoo() no segmento criado porasync ligar

#include <thread>
#include <future>
#include <iostream>

void foo()
{
  std::cout << "foo:begin" << std::endl;
  std::this_thread::sleep_for(std::chrono::seconds(10));
  std::cout << "foo:done" << std::endl;
}

int main()
{
  std::cout << "main:begin" << std::endl;
  {
    auto f = std::async(std::launch::async, foo);
    // dtor f::~f blocks until completion of foo()... why??
  }
  std::this_thread::sleep_for(std::chrono::seconds(2));
  std::cout << "main:done" << std::endl;
}

E eu seihttp: //www.stdthread.co.uk/doc/headers/future/async.htm says

O destruidor do último objeto futuro associado ao estado assíncrono do std :: future retornado será bloqueado até que o futuro esteja pront

Minha pergunta é

Q1. Esse comportamento está em conformidade com o padrão C ++ atual? Q2. Se a resposta do primeiro trimestre for sim, que afirmações dizem isso?

questionAnswers(2)

yourAnswerToTheQuestion