std::expect...sform_error(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’– NAME πŸ’–

Okay bestie, welcome to the std::expect...sform_error(3) page from the C++ Standard Libary manual ✨ (yes, that's the manual name, typo and all β€” we keep it iconic). This page is about std::expected::transform_error, and the NAME line is literally serving double duty: std::expected::transform_error β€” std::expected::transform_error. Periodt. πŸ’…


πŸ¦‹ Synopsis πŸ¦‹

Four overloads, all constexpr auto, all since C++23, each with a different ref-qualifier. The exact lineup is giving:

template< class F >                              (1) (since C++23)
constexpr auto transform_error( F&& f ) &;
template< class F >                              (2) (since C++23)
constexpr auto transform_error( F&& f ) const&;
template< class F >                              (3) (since C++23)
constexpr auto transform_error( F&& f ) &&;
template< class F >                              (4) (since C++23)
constexpr auto transform_error( F&& f ) const&&;

Here's the vibe check on the behavior, no cap: if *this contains an error value, it invokes f with the argument error() and returns a std::expected object that contains its result; otherwise, it returns a std::expected object that contains a copy of the contained expected value (obtained from operator*). 🫢

1,2) Given type G as std::remove_cv_t<std::invoke_result_t<F, decltype(error())>>. If G is not a valid template argument for std::unexpected, or G g(std::invoke(std::forward<F>(f), error())); is ill-formed, the program is ill-formed. The effect is equivalent to:

if (has_value())
{
    if (std::is_void_v<T>)
        return std::expected<T, G>();
    else
        return std::expected<T, G>(std::in_place, **this);
}
else
    // the returned std::expected object contains an unexpected value,
    // which is direct-non-list-initialized with
    // std::invoke(std::forward<F>(f), error())
    return /* an std::expected<T, G> object */;

These overloads participate in overload resolution only if std::is_void_v<T> or std::is_constructible_v<T, decltype(**this)> is true. ✨

3,4) Given type G as std::remove_cv_t<std::invoke_result_t<F, decltype(std::move(error()))>>. If G is not a valid template argument for std::unexpected, or G g(std::invoke(std::forward<F>(f), std::move(error()))); is ill-formed, the program is ill-formed. The effect is equivalent to:

if (has_value())
{
    if (std::is_void_v<T>)
        return std::expected<T, G>();
    else
        return std::expected<T, G>(std::in_place, std::move(**this));
}
else
    // the returned std::expected object contains an unexpected value,
    // which is direct-non-list-initialized with
    // std::invoke(std::forward<F>(f), std::move(error()))
    return /* an std::expected<T, G> object */;

These overloads participate in overload resolution only if std::is_void_v<T> or std::is_constructible_v<T, decltype(std::move(**this))> is true. 🌈


🌸 Parameters 🌸

  • f β€” a suitable function or Callable object whose call signature returns a non-reference type πŸŽ€

πŸŽ€ Return value πŸŽ€

A std::expected object containing either the result of f or an expected value, as described above. πŸ’–


🧚 Example 🧚

This section is incomplete.

Reason: no example. Honestly? Same, bestie. 😭


πŸ”₯ Defect reports πŸ”₯

The following behavior-changing defect reports were applied retroactively to previously published C++ standards. No cap, the standards got patched after the fact:

  • LWG 3938 β€” Applied to: C++23; Behavior as published: transform_error was ill-formed if T is not (possibly cv-qualified) void and E is not copyable; Correct behavior: made well-formed.

🫢 See also 🫢

  • or_else β€” returns the expected itself if it contains an expected value; otherwise, returns the result of the given function on the unexpected value (public member function)
  • transform β€” returns an expected containing the transformed expected value if it exists; otherwise, returns the expected itself (public member function)

πŸ’… Category πŸ’…

  • Todo no example

Shoutout to http://cppreference.com, the 2024.06.10 version/date, and this whole std::expect...sform_error(3) page β€” mwah πŸ’‹βœ¨

πŸ“¦ where this page comes from