期货,承诺和例外

Dav*_*vid 6 c++ asynchronous c++11

std::promise<int> p1;
auto f = p1.get_future();

{
    std::promise<int> p2(std::move(pr));
}

bool valid = f.valid(); // true
f.wait(); // does not throw, or fail, but returns immediately
f.get(); // throws an exception
Run Code Online (Sandbox Code Playgroud)

在打电话之前有没有办法检查未来是否会抛出get?我希望valid能检查......我真的不确定如何valid回归虚假.在promise没有设置值的情况下销毁它不会这样做.

inf*_*inf 5

有没有办法在调用get之前检查一个未来是否会抛出?

不,因为这将以某种方式等于接收将来存储的值.

我希望有效会检查......我不确定如何有效返回false.

如果未来是指只能通过创建一个共享的状态下有效将返回true std::async,std::packaged_task或std::promise.反例将是默认构造的std::future.有效的也将是错误的,一旦你已经呼吁get或share上的有效(有效==真)未来的一次.在无效(有效== false)未来上
调用除了valid或移动赋值运算符之外的任何其他函数是UB.

在没有设置值的情况下销毁承诺不会这样做.

不,如上所述,这不是有效的点,因为未来仍然指的是共享国家,只是另一方 - 承诺 - 没有实现.如果在破坏承诺时没有设置任何值或异常,则设置一个异常以指示破坏的承诺.