diff --git a/include/boost/fiber/future/future.hpp b/include/boost/fiber/future/future.hpp index 3b7753b6..9d91f3a1 100644 --- a/include/boost/fiber/future/future.hpp +++ b/include/boost/fiber/future/future.hpp @@ -93,25 +93,34 @@ struct future_base { } }; +template< typename R > +struct promise_base; + } template< typename R > class shared_future; +template< typename Signature > +class packaged_task; + template< typename R > class future : private detail::future_base< R > { private: typedef detail::future_base< R > base_t; + friend struct detail::promise_base< R >; friend class shared_future< R >; - -public: - constexpr future() noexcept = default; + template< typename Signature > + friend class packaged_task; explicit future( typename base_t::ptr_t const& p) noexcept : base_t{ p } { } +public: + constexpr future() noexcept = default; + future( future const&) = delete; future & operator=( future const&) = delete; @@ -148,15 +157,18 @@ class future< R & > : private detail::future_base< R & > { private: typedef detail::future_base< R & > base_t; + friend struct detail::promise_base< R & >; friend class shared_future< R & >; - -public: - constexpr future() noexcept = default; + template< typename Signature > + friend class packaged_task; explicit future( typename base_t::ptr_t const& p) noexcept : base_t{ p } { } +public: + constexpr future() noexcept = default; + future( future const&) = delete; future & operator=( future const&) = delete; @@ -193,15 +205,18 @@ class future< void > : private detail::future_base< void > { private: typedef detail::future_base< void > base_t; + friend struct detail::promise_base< void >; friend class shared_future< void >; - -public: - constexpr future() noexcept = default; + template< typename Signature > + friend class packaged_task; explicit future( base_t::ptr_t const& p) noexcept : base_t{ p } { } +public: + constexpr future() noexcept = default; + future( future const&) = delete; future & operator=( future const&) = delete;