未来是否从 std::async 返回,并在析构函数中使用 launch::deferred 策略块?

Dmi*_*nov 6 c++ future language-lawyer c++11 stdasync

在描述中是std::async这样说的:

如果std::future获取的 fromstd::async没有从引用移动或绑定到引用,则 the 的析构函数std::future将在完整表达式的末尾阻塞,直到异步操作完成,本质上使代码如下同步:

std::async(std::launch::async, []{ f(); }); // temporary's dtor waits for f()
std::async(std::launch::async, []{ g(); }); // does not start until f() completes
Run Code Online (Sandbox Code Playgroud)

(请注意,通过调用 std::async 以外的方式获得的 std::futures 的析构函数永远不会阻塞)

这个说法令人困惑,我不清楚在std::launch::deferred政策的情况下应该是什么行为。好吧,实验表明,它不会阻止,但我不知道是否规范明确地说,从未来返回std::asyncstd::launch::deferred政策的析构函数不会阻塞。

这打开了另一个关于默认策略的后续问题:如果未来从std::async析构函数中的块返回,std::launch::async并且在 的情况下不阻塞std::launch::deferred,那么在默认 ( std::launch::async | std::launch::deferred) 策略的情况下应该会导致非常不一致的行为。最近我在问std::asyncwith default launch policy的语义:std::async with automatic (launch::async|launch::deferred) launch policy 的语义是什么?,这个例子更让我困惑,在我们不明确知道策略的平台选择的情况下,模式的适用性是非常值得怀疑的。

更新:我发现标准P0701r1的提案并没有完全回答我的问题,但如果该提案被接受,它将解决阻塞/非阻塞析构函数的歧义。