namespace std { template <class R> class promise { public: promise(); template <class Allocator> promise(allocator_arg_t, const Allocator& a); promise(promise&& rhs) noexcept; promise(const promise& rhs) = delete; ~promise(); // assignment promise& operator=(promise&& rhs) noexcept; promise& operator=(const promise& rhs) = delete; void swap(promise& other) noexcept; // retrieving the result future<R> get_future(); // setting the result void set_value(see below); void set_exception(exception_ptr p); // setting the result with deferred notification void set_value_at_thread_exit(see below); void set_exception_at_thread_exit(exception_ptr p); }; template <class R> void swap(promise<R>& x, promise<R>& y) noexcept; template <class R, class Alloc> struct uses_allocator<promise<R>, Alloc>; }
Реализация должна предоставлять шаблонpromise и две специализации, promise<R&> иpromise<void>. Они различаются только типом аргумента функций-членовset_value иset_value_at_thread_exit, как указано в их описаниях ниже.
set_value,set_exception,set_value_at_thread_exit, Иset_exception_at_thread_exit функция - членов ведут себя так , как будто они приобретают один семафор , связанный с объектом обещания при обновлении объекта обещания.
template <class R, class Alloc>
struct uses_allocator<promise<R>, Alloc>
: true_type { };
promise();
template <class Allocator>
promise(allocator_arg_t, const Allocator& a);
Effects: создаетpromise объект и общее состояние. Второй конструктор использует распределительa для выделения памяти для общего состояния.
promise(promise&& rhs) noexcept;
Effects: создает новыйpromise объект и передает право собственности на совместно используемое состояниеrhs (если таковое имеется) на вновь созданный объект.
~promise();
Effects: Отменяет любое общее состояние ([futures.state]).
promise& operator=(promise&& rhs) noexcept;
Effects: Отменяет любое разделяемое состояние ([futures.state]), а затем как если бы promise(std::move(rhs)).swap(*this).
void swap(promise& other) noexcept;
Postconditions:*this имеет общее состояние (если есть), котороеother было до вызоваswap.other имеет общее состояние (если есть), которое *this было до вызоваswap.
future<R> get_future();
Throws:future_error если*this не имеет общего состояния или если get_future уже был вызван вpromise с тем же общим состоянием, что и*this.
void promise::set_value(const R& r);
void promise::set_value(R&& r);
void promise<R&>::set_value(R& r);
void promise<void>::set_value();
Effects: Атомарно сохраняет значениеr в общем состоянии и делает это состояние готовым ([futures.state]).
Throws:
future_error если его общее состояние уже имеет сохраненное значение или исключение, или
для первой версии любое исключение, созданное конструктором, выбранным для копирования объектаR, или
для второй версии любое исключение, созданное конструктором, выбранным для перемещения объектаR.
void set_exception(exception_ptr p);
Effects: Атомарно сохраняет указатель исключенияp в общем состоянии и делает это состояние готовым ([futures.state]).
void promise::set_value_at_thread_exit(const R& r);
void promise::set_value_at_thread_exit(R&& r);
void promise<R&>::set_value_at_thread_exit(R& r);
void promise<void>::set_value_at_thread_exit();
Effects: Сохраняет значениеr в общем состоянии, не делая это состояние немедленно готовым. Планирует, что состояние будет подготовлено к выходу из текущего потока после того, как все объекты продолжительности хранения потока, связанные с текущим потоком, будут уничтожены.
Throws:
future_error если его общее состояние уже имеет сохраненное значение или исключение, или
для первой версии любое исключение, созданное конструктором, выбранным для копирования объектаR, или
для второй версии любое исключение, созданное конструктором, выбранным для перемещения объектаR.
void set_exception_at_thread_exit(exception_ptr p);
Effects: Сохраняет указатель исключенияp в общем состоянии, не делая это состояние немедленно готовым. Планирует, что состояние будет подготовлено к выходу из текущего потока после того, как все объекты продолжительности хранения потока, связанные с текущим потоком, будут уничтожены.
template <class R>
void swap(promise<R>& x, promise<R>& y) noexcept;