std::expected<T,E>::transform

来自cppreference.com
 
 
 
 
template< class F >
constexpr auto transform( F&& f ) &;
(1) (C++23 起)
template< class F >
constexpr auto transform( F&& f ) const&;
(2) (C++23 起)
template< class F >
constexpr auto transform( F&& f ) &&;
(3) (C++23 起)
template< class F >
constexpr auto transform( F&& f ) const&&;
(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*()))>>
  • 否则(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
  1. 调用 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))
  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
(公开成员函数) [编辑]