我正在尝试捕获已在http://www.cplusplus.com/reference/future/future_errc/
中看到的Already-Retrieved异常try {
prom.get_future();
prom.get_future(); // throws std::future_error with future_already_retrieved
}
catch (std::future_error& e) {
if (e.code() == std::make_error_condition(std::future_errc::future_already_retrieved))
std::cerr << "[future already retrieved]\n";
else
std::cerr << "[unknown exception]\n";
}
但我总是得到一个无国家的谴责。 通过查看标准的未来实施:
_Ty& _Get_value() const
{ // return the stored result or throw stored exception
if (!valid()) // will check if already retrieved, and return false
_Throw_future_error(make_error_code(future_errc::no_state));
return (_Assoc_state->_Get_value(_Get_only_once)); // only this
// method can throw the already retrieved exception but its not
// being hit because of previous valid() check
}
这是Visual Studio 2013中的错误还是功能?
答案 0 :(得分:3)
从cppreference我发现更可靠:
如果*没有共享状态或者已经调用了get_future,则抛出异常。
有什么例外?
抛出:future_error如果
*this
没有共享状态,或者如果已经在具有与此相同的共享状态的promise上调用了get_future。
- (14.1)future_already_retrieved如果已经在a上调用了get_future 承诺与* this相同的共享状态。
- (14.2)no_state if * this没有共享状态。
所以这是MSVC2013中的一个错误。