标准库标头 <expected> (C++23)

来自cppreference.com
< cpp‎ | header


 
 
标准库头
 

此标头是工具库的一部分。

目录

(C++23)
含有一个预期值或错误值的包装器
(类模板)[编辑]
(C++23)
表示一个非预期值
(类模板)[编辑]
指示对含有非预期值的 expected 的有检查访问的异常
(类模板)[编辑]
expected 中非预期值的原位构造标签
(类)(常量)[编辑]

[编辑]概要

namespace std {// 类模板 unexpectedtemplate<class E>class unexpected;   // 类模板 bad_expected_accesstemplate<class E>class bad_expected_access   // bad_expected_access 的 void 特化template<>class bad_expected_access<void>;   // unexpected 值的原地构造struct unexpect_t {explicit unexpect_t()=default;};inlineconstexpr unexpect_t unexpect{};   // 类模板 expectedtemplate<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... Args>constexprexplicit unexpected(in_place_t, Args&&...);template<class U, class... Args>constexprexplicit unexpected(in_place_t, initializer_list<U>, Args&&...);template<class Err = E>constexprexplicit unexpected(Err&&);   // 赋值constexpr unexpected& operator=(const unexpected&)=default;constexpr unexpected& operator=(unexpected&&)=default;   // 观察器constexprconst E& error()const&noexcept;constexpr E& error()&noexcept;constexprconst E&& error()const&&noexcept;constexpr E&& error()&&noexcept;   // 交换constexprvoid swap(unexpected& other)noexcept(/* 见说明 */);   friendconstexprvoid swap(unexpected& x, unexpected& y)noexcept(noexcept(x.swap(y)));   // 相等运算template<class E2>friendconstexprbool operator==(const unexpected&, const unexpected<E2>&);   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:   // 显式构造explicit bad_expected_access(E);   // 观察器constchar* what()constnoexcept override; E& error()&noexcept;const E& error()const&noexcept; E&& error()&&noexcept;const E&& error()const&&noexcept;   private: E unex;// 仅用于阐释};}

[编辑]类模板特化 std::bad_expected_access<void>

namespace std {template<>class bad_expected_access<void>:public exception {protected:// 构造 bad_expected_access()noexcept; bad_expected_access(const bad_expected_access&); bad_expected_access(bad_expected_access&&); bad_expected_access& operator=(const bad_expected_access&); bad_expected_access& operator=(bad_expected_access&&);   ~bad_expected_access();   public:constchar* what()constnoexcept 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();constexprexplicit(/* 见说明 */) expected(const expected&);constexprexplicit(/* 见说明 */) expected(expected&&)noexcept(/* 见说明 */);template<class U, class G>constexprexplicit(/* 见说明 */) expected(const expected<U, G>&);template<class U, class G>constexprexplicit(/* 见说明 */) expected(expected<U, G>&&);   template<class U = remove_cv_t<T>>constexprexplicit(/* 见说明 */) expected(U&& v);   template<class G>constexpr expected(const unexpected<G>&);template<class G>constexpr expected(unexpected<G>&&);   template<class... Args>constexprexplicit expected(in_place_t, Args&&...);template<class U, class... Args>constexprexplicit expected(in_place_t, initializer_list<U>, Args&&...);template<class... Args>constexprexplicit expected(unexpect_t, Args&&...);template<class U, class... Args>constexprexplicit 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;   // 交换constexprvoid swap(expected&)noexcept(/* 见说明 */);friendconstexprvoid swap(expected&, expected&)noexcept(/* 见说明 */);   // 观察器constexprconst T* operator->()constnoexcept;constexpr T* operator->()noexcept;constexprconst T& operator*()const&noexcept;constexpr T& operator*()&noexcept;constexprconst T&& operator*()const&&noexcept;constexpr T&& operator*()&&noexcept;constexprexplicit operator bool()constnoexcept;constexprbool has_value()constnoexcept;constexprconst T& value()const&;constexpr T& value()&;constexprconst T&& value()const&&;constexpr T&& value()&&;constexprconst E& error()const&;constexpr E& error()&;constexprconst E&& error()const&&;constexpr E&& error()&&;template<class U = remove_cv_t<T>>constexpr T value_or(U&&)const&;template<class U = remove_cv_t<T>>constexpr T value_or(U&&)&&;template<class G = E>constexpr E error_or(G&&)const&;template<class G = E>constexpr E error_or(G&&)&&;   // 单子操作template<class F>constexprauto and_then(F&& f)&;template<class F>constexprauto and_then(F&& f)&&;template<class F>constexprauto and_then(F&& f)const&;template<class F>constexprauto and_then(F&& f)const&&;template<class F>constexprauto or_else(F&& f)&;template<class F>constexprauto or_else(F&& f)&&;template<class F>constexprauto or_else(F&& f)const&;template<class F>constexprauto or_else(F&& f)const&&;template<class F>constexprauto transform(F&& f)&;template<class F>constexprauto transform(F&& f)&&;template<class F>constexprauto transform(F&& f)const&;template<class F>constexprauto transform(F&& f)const&&;template<class F>constexprauto transform_error(F&& f)&;template<class F>constexprauto transform_error(F&& f)&&;template<class F>constexprauto transform_error(F&& f)const&;template<class F>constexprauto transform_error(F&& f)const&&;   // 相等运算template<class T2, class E2> requires (!is_void_v<T2>)friendconstexprbool operator==(const expected& x, const expected<T2, E2>& y);template<class T2>friendconstexprbool operator==(const expected&, const T2&);template<class E2>friendconstexprbool operator==(const expected&, const unexpected<E2>&);   private:bool has_val;// 仅用于解释union{ T val;// 仅用于解释 E unex;// 仅用于解释};};}

[编辑]std::expectedvoid 类型的部分特化

namespace std {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;constexprexplicit(/* 见说明 */) expected(const expected&);constexprexplicit(/* 见说明 */) expected(expected&&)noexcept(/* 见说明 */);template<class U, class G>constexprexplicit(/* 见说明 */) expected(const expected<U, G>&);template<class U, class G>constexprexplicit(/* 见说明 */) expected(expected<U, G>&&);   template<class G>constexpr expected(const unexpected<G>&);template<class G>constexpr expected(unexpected<G>&&);   constexprexplicit expected(in_place_t)noexcept;template<class... Args>constexprexplicit expected(unexpect_t, Args&&...);template<class U, class... Args>constexprexplicit 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>&&);constexprvoid emplace()noexcept;   // 交换constexprvoid swap(expected&)noexcept(/* 见说明 */);friendconstexprvoid swap(expected&, expected&)noexcept(/* 见说明 */);   // 观察器constexprexplicit operator bool()constnoexcept;constexprbool has_value()constnoexcept;constexprvoid operator*()constnoexcept;constexprvoid value()const&;constexprvoid value()&&;constexprconst E& error()const&;constexpr E& error()&;constexprconst E&& error()const&&;constexpr E&& error()&&;   // 单子操作template<class F>constexprauto and_then(F&& f)&;template<class F>constexprauto and_then(F&& f)&&;template<class F>constexprauto and_then(F&& f)const&;template<class F>constexprauto and_then(F&& f)const&&;template<class F>constexprauto or_else(F&& f)&;template<class F>constexprauto or_else(F&& f)&&;template<class F>constexprauto or_else(F&& f)const&;template<class F>constexprauto or_else(F&& f)const&&;template<class F>constexprauto transform(F&& f)&;template<class F>constexprauto transform(F&& f)&&;template<class F>constexprauto transform(F&& f)const&;template<class F>constexprauto transform(F&& f)const&&;template<class F>constexprauto transform_error(F&& f)&;template<class F>constexprauto transform_error(F&& f)&&;template<class F>constexprauto transform_error(F&& f)const&;template<class F>constexprauto transform_error(F&& f)const&&;   // 相等运算template<class T2, class E2> requires is_void_v<T2>friendconstexprbool operator==(const expected& x, const expected<T2, E2>& y);template<class E2>friendconstexprbool operator==(const expected&, const unexpected<E2>&);   private:bool has_val;// 仅用于解释union{ E unex;// 仅用于解释};};}
close