std::expected<T,E>::transform
来自cppreference.com
| |
(1) | (C++23 起) |
| |
(2) | (C++23 起) |
| |
(3) | (C++23 起) |
| |
(4) | (C++23 起) |
如果 *this 包含预期值,则调用 f 并返回一个包含其结果的 std::expected 对象;否则,返回一个包含 error() 副本的 std::expected 对象。
如果 T 不是(可能有 cv 限定的)void,则将所含值(operator*())作为实参传递给 f;否则 f 不接受实参。
设 U 为:
- 如果
T不是(可能有 cv 限定的)void:- 对于重载 (1-2),
std::remove_cv_t<std::invoke_result_t<F, decltype(operator*())>>; - 对于重载 (3-4),
std::remove_cv_t<std::invoke_result_t<F, decltype(std::move(operator*()))>>;
- 对于重载 (1-2),
- 否则(
T是可能有 cv 限定的void),std::remove_cv_t<std::invoke_result_t<F>>。
U 必须是 std::expected 的有效值类型。U 类型的变量必须能从调用结果构造(但不需要是可移动构造的)。返回类型为 std::expected<U, E>。
1-2) 这些重载只有在
std::is_constructible_v<E, decltype(error())> 为 true 时才会参与重载决议。3-4) 这些重载只有在
std::is_constructible_v<E, decltype(std::move(error()))> 为 true 时才会参与重载决议。形式上,这些函数执行以下步骤:
- 如果
*this包含预期值val:
- 调用
f,方式如下:- 对于重载 (1,2),如果
std::is_void_v<T>为false,则为std::invoke(std::forward<F>(f), val); - 对于重载 (3,4),如果
std::is_void_v<T>为false,则为std::invoke(std::forward<F>(f), std::move(val)); - 如果
std::is_void_v<T>为true,则为std::invoke(std::forward<F>(f))。
- 对于重载 (1,2),如果
- 然后:
- 如果
std::is_void_v<U>为false,则返回一个包含预期值的std::expected对象,该预期值从调用结果直接初始化; - 否则,返回
std::expected<U, E>()。
- 如果
- 调用
- 否则(
*this包含错误值),返回std::expected<U, E>(std::unexpect, error())。
参数
| f | - | 适合的函数或 可调用 (Callable) 对象,它的返回类型不是引用类型 |
返回值
如上所述的、包含 f 的结果或错误值的 std::expected 对象。
注解
| 功能特性测试宏 | 值 | 标准 | 功能特性 |
|---|---|---|---|
__cpp_lib_expected |
202211L |
(C++23) | std::expected 的单子函数
|
示例
| 本节未完成 原因:暂无示例 |
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 3938 | C++23 | 通过 value() 获取预期值,这要求 E 可复制构造
|
改成 **this
|
| LWG 3973 | C++23 | 通过 **this 获取预期值,这涉及实参依赖查找。</ref>
|
改成直接指名成员 |
参阅
若含有预期值则返回 expected 本身,否则返回含有变换后非预期值的 expected (公开成员函数) |