To fix this I think we can define macro:
#if defined(__cpp_exceptions) || defined(_CPPUNWIND)
#define ZEUS_EXPECTED_EXCEPTIONS_ENABLED
#endif
#ifdef ZEUS_EXPECTED_EXCEPTIONS_ENABLED
#define ZEUS_EXPECTED_THROW_EXCEPTION(e) throw((e));
#else
#define ZEUS_EXPECTED_THROW_EXCEPTION(e) std::terminate();
#endif
and instead of throwing exception directly throw bad_expected_access(error()); we should call this macro like this: ZEUS_EXPECTED_THROW_EXCEPTION(bad_expected_access(error()));