Стандартное будущее исключение - уже получено, стандартная ошибка?

Я пытаюсь перехватить исключение «Уже получено», как показано на http://www.cplusplus.com/reference/future/future_errc/

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";
}

Но я всегда получаю исключение без состояния. Глядя на будущую реализацию std:

_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 или функция?


person vincentB    schedule 18.09.2015    source источник
comment
Вы должны смотреть на реализацию std::promise или std::packaged_task (в частности, реализацию std::promise::get_future или std::packaged_task::get_future), а не на реализацию std::future.   -  person cpplearner    schedule 18.09.2015
comment
Да, мне это кажется ошибкой Visual Studio.   -  person Jonathan Wakely    schedule 13.10.2015


Ответы (1)


Из cppreference, который я считаю более надежным:

Исключение выдается, если *this не имеет общего состояния или get_future уже был вызван.

Какие исключения?

Выдает: future_error, если *this не имеет общего состояния или если get_future уже был вызван для промиса с тем же общим состоянием, что и *this.

  • (14.1) future_already_retrieved, если get_future уже был вызван для промиса с тем же общим состоянием, что и *this.
  • (14.2) no_state, если *это не имеет общего состояния.

Так что это ошибка в MSVC2013.

person Yakk - Adam Nevraumont    schedule 18.09.2015
comment
Но OP не вызывает future::get(), promise::get_future() - это совершенно другая функция. - person Jonathan Wakely; 13.10.2015
comment
@JonathanWakely Хм. Не знаю, о чем я думал, но это было неправильно. Ответ исправлен. - person Yakk - Adam Nevraumont; 13.10.2015