std future exception - 已经检索过,std bug?

时间:2015-09-18 09:21:07

标签: c++ c++11 exception-handling promise c++-standard-library

我正在尝试捕获已在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中的错误还是功能?

1 个答案:

答案 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中的一个错误。