namespace std {
template<class R>
class shared_future {
public:
shared_future() noexcept;
shared_future(const shared_future& rhs) noexcept;
shared_future(future<R>&&) noexcept;
shared_future(shared_future&& rhs) noexcept;
~shared_future();
shared_future& operator=(const shared_future& rhs) noexcept;
shared_future& operator=(shared_future&& rhs) noexcept;
// retrieving the value
see below get() const;
// 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;
};
}shared_future() noexcept;
shared_future(const shared_future& rhs) noexcept;
shared_future(future<R>&& rhs) noexcept;
shared_future(shared_future&& rhs) noexcept;
~shared_future();
shared_future& operator=(shared_future&& rhs) noexcept;
shared_future& operator=(const shared_future& rhs) noexcept;
const R& shared_future::get() const;
R& shared_future<R&>::get() const;
void shared_future<void>::get() const;
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;