Namespaces
Variants

Standard library header <expected> (C++23)

From cppreference.net
Standard library headers

此头文件属于 通用工具 库的一部分。

目录

(C++23)
包含期望值或错误值的包装器
(类模板)
(C++23)
表示为非期望值
(类模板)
指示对包含非期望值的 expected 进行检查访问的异常
(类模板)
expected 中用于非期望值的原位构造标签
(标签)

概要

// 基本独立实现
namespace std {
  // 类模板 unexpected
  template<class E>
  class unexpected;
  // 类模板 bad_expected_access
  template<class E>
  class bad_expected_access;
  // void 类型的特化
  template<>
  class bad_expected_access<void>;
  // unexpected 值的原位构造
  struct unexpect_t
  {
    explicit unexpect_t() = default;
  };
  inline constexpr unexpect_t unexpect{};
  // 类模板 expected
  template<class T, class E>
  class expected; // 部分独立实现
  // expected 对 void 类型的部分特化
  template<class T, class E>
    requires is_void_v<T>
  class expected<T, E>; // 部分独立实现
}

类模板 std::unexpected

namespace std {
  template<class E>
  class unexpected
  {
  public:
    // 构造函数
    constexpr unexpected(const unexpected&) = default;
    constexpr unexpected(unexpected&&)      = default;
    template<class Err = E>
    constexpr explicit unexpected(Err&&);
    template<class... Args>
    constexpr explicit unexpected(in_place_t, Args&&...);
    template<class U, class... Args>
    constexpr explicit unexpected(in_place_t, initializer_list<U>, Args&&...);
    constexpr unexpected& operator=(const unexpected&) = default;
    constexpr unexpected& operator=(unexpected&&)      = default;
    constexpr const E& error() const& noexcept;
    constexpr E& error() & noexcept;
    constexpr const E&& error() const&& noexcept;
    constexpr E&& error() && noexcept;
    constexpr void swap(unexpected& other) noexcept(/* 详见说明 */);
    template<class E2>
    friend constexpr bool operator==(const unexpected&, const unexpected<E2>&);
    friend constexpr void swap(unexpected& x,
                               unexpected& y) noexcept(noexcept(x.swap(y)));
  private:
    E /*unex*/; // 仅用于说明
  };
  template<class E>
  unexpected(E) -> unexpected<E>;
}

类模板 std::bad_expected_access

namespace std {
  template<class E>
  class bad_expected_access : public bad_expected_access<void>
  {
  public:
    constexpr explicit bad_expected_access(E);
    constexpr const char* what() const noexcept override;
    constexpr E& error() & noexcept;
    constexpr const E& error() const& noexcept;
    constexpr E&& error() && noexcept;
    constexpr const E&& error() const&& noexcept;
  private:
    E /*unex*/; // 仅用于说明
  };
}

类模板特化 std::bad_expected_access<void>

namespace std {
  template<>
  class bad_expected_access<void> : public exception
  {
  protected:
    constexpr bad_expected_access() noexcept;
    constexpr bad_expected_access(const bad_expected_access&) noexcept;
    constexpr bad_expected_access(bad_expected_access&&) noexcept;
    constexpr bad_expected_access& operator=(const bad_expected_access&) noexcept;
    constexpr bad_expected_access& operator=(bad_expected_access&&) noexcept;
    constexpr ~bad_expected_access();
  public:
    constexpr const char* what() const noexcept override;
  };
}

类模板 std::expected

namespace std {
  template<class T, class E>
  class expected
  {
  public:
    using value_type      = T;
    using error_type      = E;
    using unexpected_type = unexpected<E>;
    template<class U>
    using rebind = expected<U, error_type>;
    // 构造函数
    constexpr expected();
    constexpr expected(const expected&);
    constexpr expected(expected&&) noexcept(/* 参见描述 */);
    template<class U, class G>
    constexpr explicit(/* 参见描述 */) expected(const expected<U, G>&);
    template<class U, class G>
    constexpr explicit(/* 参见描述 */) expected(expected<U, G>&&);
    template<class U = remove_cv_t<T>>
    constexpr explicit(/* 参见描述 */) expected(U&& v);
    template<class G>
    constexpr explicit(/* 参见描述 */) expected(const unexpected<G>&);
    template<class G>
    constexpr explicit(/* 参见描述 */) expected(unexpected<G>&&);
    template<class... Args>
    constexpr explicit expected(in_place_t, Args&&...);
    template<class U, class... Args>
    constexpr explicit expected(in_place_t, initializer_list<U>, Args&&...);
    template<class... Args>
    constexpr explicit expected(unexpect_t, Args&&...);
    template<class U, class... Args>
    constexpr explicit expected(unexpect_t, initializer_list<U>, Args&&...);
    // 析构函数
    constexpr ~expected();
    // 赋值操作
    constexpr expected& operator=(const expected&);
    constexpr expected& operator=(expected&&) noexcept(/* 参见描述 */);
    template<class U = remove_cv_t<T>>
    constexpr expected& operator=(U&&);
    template<class G>
    constexpr expected& operator=(const unexpected<G>&);
    template<class G>
    constexpr expected& operator=(unexpected<G>&&);
    template<class... Args>
    constexpr T& emplace(Args&&...) noexcept;
    template<class U, class... Args>
    constexpr T& emplace(initializer_list<U>, Args&&...) noexcept;
    // 交换操作
    constexpr void swap(expected&) noexcept(/* 参见描述 */);
    friend constexpr void swap(expected& x, expected& y) noexcept(noexcept(x.swap(y)));
    // 观察器
    constexpr const T* operator->() const noexcept;
    constexpr T* operator->() noexcept;
    constexpr const T& operator*() const& noexcept;
    constexpr T& operator*() & noexcept;
    constexpr const T&& operator*() const&& noexcept;
    constexpr T&& operator*() && noexcept;
    constexpr explicit operator bool() const noexcept<

针对 void 类型的 std::expected 部分特化

template<class T, class E>
  requires is_void_v<T>
class expected<T, E>
{
public:
  using value_type      = T;
  using error_type      = E;
  using unexpected_type = unexpected<E>;
  template<class U>
  using rebind = expected<U, error_type>;
  // 构造函数
  constexpr expected() noexcept;
  constexpr expected(const expected&);
  constexpr expected(expected&&) noexcept(/* 见描述 */);
  template<class U, class G>
  constexpr explicit(/* 见描述 */) expected(const expected<U, G>&);
  template<class U, class G>
  constexpr explicit(/* 见描述 */) expected(expected<U, G>&&);
  template<class G>
  constexpr explicit(/* 见描述 */) expected(const unexpected<G>&);
  template<class G>
  constexpr explicit(/* 见描述 */) expected(unexpected<G>&&);
  constexpr explicit expected(in_place_t) noexcept;
  template<class... Args>
  constexpr explicit expected(unexpect_t, Args&&...);
  template<class U, class... Args>
  constexpr explicit expected(unexpect_t, initializer_list<U>, Args&&...);
  // 析构函数
  constexpr ~expected();
  // 赋值操作
  constexpr expected& operator=(const expected&);
  constexpr expected& operator=(expected&&) noexcept(/* 见描述 */);
  template<class G>
  constexpr expected& operator=(const unexpected<G>&);
  template<class G>
  constexpr expected& operator=(unexpected<G>&&);
  constexpr void emplace() noexcept;
  // 交换操作
  constexpr void swap(expected&) noexcept(/* 见描述 */);
  friend constexpr void swap(expected& x, expected& y) noexcept(noexcept(x.swap(y)));
  // 观察器
  constexpr explicit operator bool() const noexcept;
  constexpr bool has_value() const noexcept;
  constexpr void operator*() const noexcept;
  constexpr void value() const&; // 独立部署-已删除
  constexpr void value() &&;     // 独立部署-已删除
  constexpr const E& error() const& noexcept;
  constexpr E& error() & noexcept;
  constexpr const E&& error() const&& noexcept;
  constexpr E&& error() && noexcept;
  template<class G = E>
  constexpr E error_or(G&&) const&;
  template<class G = E>
  constexpr E error_or(G&&) &&;
  // 单子操作
  template<class F>
  constexpr auto and_then(F&& f) &;
  template<class F>
  constexpr auto and_then(F&& f) &&;
  template<class F>
  constexpr auto and_then(F&& f) const<span class="