std::expected<T,E>::or_else
来自cppreference.com
template< class F > constexpr auto or_else( F&& f ) &; |
(1) | (C++23 起) |
template< class F > constexpr auto or_else( F&& f ) const&; |
(2) | (C++23 起) |
template< class F > constexpr auto or_else( F&& f ) &&; |
(3) | (C++23 起) |
template< class F > constexpr auto or_else( F&& f ) const&&; |
(4) | (C++23 起) |
如果 *this 包含不期待的值,调用 f 并返回其结果;否则,返回一个包含了 value()
的复制的 std::expected
对象。包含的不期待的值( error()
)将作为参数传递给 f 。
令 G
为:
- 对于重载 (1-2) , std::remove_cvref_t<std::invoke_result_t<F, decltype(error())>> ;
- 对于重载 (3-4) , std::remove_cvref_t<std::invoke_result_t<F, decltype(std::move(error()))>> ;
返回值类型是 G
,其必须是 std::expected
的特化,且 std::is_same_v<G::value_type, T> 必须为 true 。
1-2) 等价于
这些重载只有在 std::is_void_v<T> 或 std::is_constructible_v<T, decltype(value())> 为 true 时才会参与重载决议.
if (has_value()) { if constexpr (std::is_void_v<T>) return G(); else return G(std::in_place, value()); } else { return std::invoke(std::forward<F>(f), error()); }
3-4) 等价于
这些重载只有在 std::is_void_v<T> 或 std::is_constructible_v<T, decltype(std::move(value()))> 为 true时才会参与重载决议.
if (has_value()) { if constexpr (std::is_void_v<T>) return G(); else return G(std::in_place, std::move(value())); } else { return std::invoke(std::forward<F>(f), std::move(error())); }
参数
f | - | 适合的函数或 可调用 (Callable) 对象,返回 std::expected |
返回值
f 的结果或包含期待的值的 std::expected 的对象,如上所述
注解
功能特性测试宏 | 值 | 标准 | 注释 |
---|---|---|---|
__cpp_lib_expected |
202211L | (C++23) | std::expected 的单子函数
|
示例
本节未完成 原因:暂无示例 |
参阅
若含有期待的值则返回 expected 本身,否则返回含有变换后不期待的值的 expected (公开成员函数) |