Шаблон классаfuture определяет тип для асинхронных возвращаемых объектов, которые не разделяют свое общее состояние с другими асинхронными возвращаемыми объектами. Созданный по умолчаниюfuture объект не имеет общего состояния.future Объект с общим состоянием может быть создан с помощью функций наasynchronous providers или с помощью конструктора перемещения и разделяет его общее состояние с первоначальным асинхронным поставщиком. Результат (значение или исключение)future объекта может быть установлен путем вызова соответствующей функции для объекта, который имеет то же общее состояние.
[ Note: Функции-членыfuture не синхронизируются сами с собой или с функциями-членамиshared_future. ] — end note
Эффект вызова какой - либо функции - члена, кроме деструктора, оператор присваивания-ход,shareилиvalid наfuture объекте , для которого valid() == false не определено. [ Note: Действительно перейти от будущего объекта, для которогоvalid() == false. ] [ Реализациям рекомендуется обнаруживать этот случай и генерировать объект типа с условием ошибки . ] — end note Note: future_error future_errc::no_state — end note
namespace std { template <class R> class future { public: future() noexcept; future(future&&) noexcept; future(const future& rhs) = delete; ~future(); future& operator=(const future& rhs) = delete; future& operator=(future&&) noexcept; shared_future<R> share() noexcept; // retrieving the value see below get(); // functions to check state bool valid() const noexcept; void wait() const; template <class Rep, class Period> future_status wait_for(const chrono::duration<Rep, Period>& rel_time) const; template <class Clock, class Duration> future_status wait_until(const chrono::time_point<Clock, Duration>& abs_time) const; }; }
Реализация должна предоставлять шаблонfuture и две специализации, future<R&> иfuture<void>. Они отличаются только типом возвращаемого значения и возвращаемым значением функции-членаget, как указано в ее описании ниже.
future() noexcept;
future(future&& rhs) noexcept;
Effects: Move создаетfuture объект, который ссылается на общее состояние, на которое первоначально ссылалсяrhs (если таковой имеется).
~future();
future& operator=(future&& rhs) noexcept;
Effects:
Освобождает любое общее состояние ([futures.state]).
переместить Назначает содержимоеrhs в*this.
shared_future<R> share() noexcept;
R future::get();
R& future<R&>::get();
void future<void>::get();
[ Note: Как описано выше, шаблон и две его требуемые специализации отличаются только типом возвращаемого значения и возвращаемым значением функции-членаget. ] — end note
Effects:
wait()s, пока общее состояние не будет готово, затем извлекает значение, хранящееся в общем состоянии;
освобождает любое разделяемое состояние ([futures.state]).
bool valid() const noexcept;
void wait() const;
template <class Rep, class Period>
future_status wait_for(const chrono::duration<Rep, Period>& rel_time) const;
Effects: Нет, если общее состояние содержит отложенную функцию ([futures.async]), в противном случае блокируется, пока общее состояние не будет готово или пока не истечет относительный тайм-аут ([thread.req.timing]), указанный вrel_time .
Returns:
future_status::deferred если общее состояние содержит отложенную функцию.
future_status::ready если общее состояние готово.
future_status::timeout если функция возвращается из-за истечения относительного тайм-аута ([thread.req.timing]), указанного вrel_time .
Throws: исключения, связанные с тайм-аутом ([thread.req.timing]).
template <class Clock, class Duration>
future_status wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
Effects: Нет, если общее состояние содержит отложенную функцию ([futures.async]), в противном случае блокируется, пока общее состояние не будет готово или пока не истечет абсолютный тайм-аут ([thread.req.timing]), указанный вabs_time .
Returns:
future_status::deferred если общее состояние содержит отложенную функцию.
future_status::ready если общее состояние готово.
future_status::timeout если функция возвращается, потому что истек абсолютный тайм-аут ([thread.req.timing]), указанный вabs_time .
Throws: исключения, связанные с тайм-аутом ([thread.req.timing]).