future::share() is not noexcept, it has a narrow contact requiring valid() as per the blanket
wording in 30.6.7 [futures.unique_future] p3. Its effects, however, are return shared_future<R>(std::move(*this)),
which is noexcept as it has a wide contract. If the source future isn't valid then the target
shared_future simply won't be valid either. There appears to be no technical reason preventing future::share()
from having a wide contract, and thus being noexcept.

-3- The effect of calling any member function other than the destructor, the move-assignment operator, share,
or valid on a future object for which valid() == false is undefined. [Note: Implementations
are encouraged to detect this case and throw an object of type future_error with an error condition of
future_errc::no_state. — end note]