
Niall Douglas wrote:
I would assume an expected<T, E1, .., En> could only return a std::variant<E1, ..., En> from its .error(). I can't think what else it could do.
As the foremost authority on the nonexistent expected<T, E...>, I can tell you what it does: // F shall be in E... template<class F> bool has_error() const; template<class F> F error() const; // if sizeof...(E) == 1 bool has_error() const; E1 error() const; It returns the equivalent of variant<E...> not from error(), but from unexpected<E...> unexpected() const; which allows you to expected<T, E1, E2, E3> function() { expected<U, E1, E2> e1 = function1(); if( !e1 ) return e1.unexpected(); expected<V, E3> e2 = function2(); if( !e2 ) return e2.unexpected(); return e1.value() + e2.value(); }