Spec-Zone.ru › C++

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

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, содержащий его результат; в противном случае возвращает объект std::expected, содержащий копию error().

Если 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, как если бы это было выполнено посредством
    • std::invoke(std::forward<F>(f), val) для перегрузок (1,2), если std::is_void_v<T> равно false;
    • std::invoke(std::forward<F>(f), std::move(val)) для перегрузок (3,4), если std::is_void_v<T> равно false;
    • std::invoke(std::forward<F>(f)), если std::is_void_v<T> равно true.
  2. Затем:
    • если std::is_void_v<U> равно false, вернуть объект std::expected, содержащий ожидаемое значение, непосредственно инициализированный результатом вызова;
    • в противном случае вернуть std::expected<U, E>().
  • В противном случае (*this содержит ошибочное значение) вернуть std::expected<U, E>(std::unexpect, error()).

Параметры

f - подходящая функция или объект Callable, сигнатура вызова которого возвращает тип, не являющийся ссылочным

Возвращаемое значение

Объект std::expected, содержащий либо результат f, либо ошибочное значение, как описано выше.

Примечания

Макрос проверки поддержки функции Значение Стандарт Функция
__cpp_lib_expected 202211L (C++23) Монадические функции для std::expected

Пример

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

Отчёт об ошибке Применяется к Опубликованное поведение Корректное поведение
LWG 3938 C++23 ожидаемое значение получалось с помощью value(), для чего требовалось, чтобы E был копируемо конструируемым изменено на **this
LWG 3973 C++23 ожидаемое значение получалось с помощью **this, что может включать поиск, зависящий от аргументов изменено на прямое указание имени члена

См. также

transform_error
возвращает сам expected, если он содержит ожидаемое значение; в противном случае возвращает expected, содержащее преобразованное неожиданное значение
(открытая функция-член)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/expected/transform

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API