Spec-Zone.ru › C++

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

Основной шаблон
template< class F >
constexpr auto transform_error( F&& f ) &;
(1) (с C++23)
template< class F >
constexpr auto transform_error( F&& f ) const&;
(2) (с C++23)
template< class F >
constexpr auto transform_error( F&& f ) &&;
(3) (с C++23)
template< class F >
constexpr auto transform_error( F&& f ) const&&;
(4) (с C++23)
void частичная специализация
template< class F >
constexpr auto transform_error( F&& f ) &;
(5) (с C++23)
template< class F >
constexpr auto transform_error( F&& f ) const&;
(6) (с C++23)
template< class F >
constexpr auto transform_error( F&& f ) &&;
(7) (с C++23)
template< class F >
constexpr auto transform_error( F&& f ) const&&;
(8) (с C++23)

Если *this содержит неожиданное значение, вызывает f, передавая неожиданное значение *this в качестве аргумента, и возвращает объект std::expected, содержащий неожиданное значение, инициализированное результатом f. В противном случае возвращает объект std::expected, представляющий ожидаемое значение.

1-4) Ожидаемое значение инициализируется ожидаемым значением val объекта *this.

Пусть тип G определяется следующим образом:

1,2) std::remove_cv_t<std::invoke_result_t<F,decltype(error())>>
3,4) std::remove_cv_t<std::invoke_result_t<F,decltype(std::move(error()))>>
5,6) std::remove_cv_t<std::invoke_result_t<F,decltype(error())>>
7,8) std::remove_cv_t<std::invoke_result_t<F,decltype(std::move(error()))>>

Если выполняется хотя бы одно из следующих условий, программа некорректна:

  • G не является допустимым аргументом шаблона для std::unexpected.
  • Следующее соответствующее объявление некорректно:
1,2) G g(std::invoke(std::forward<F>(f), error()));
3,4) G g(std::invoke(std::forward<F>(f), std::move(error()));
5,6) G g(std::invoke(std::forward<F>(f), error()));
7,8) G g(std::invoke(std::forward<F>(f), std::move(error()));
1,2) Эта перегрузка участвует в разрешении перегрузки, только если std::is_constructible_v<T, decltype((val))> является true.
3,4) Эта перегрузка участвует в разрешении перегрузки, только если std::is_constructible_v<T, decltype(std::move(val))> является true.

Параметры

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

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

Пусть выражение expr определяется следующим образом:

1,2) std::invoke(std::forward<F>(f), error())
3,4) std::invoke(std::forward<F>(f), std::move(error()))
5,6) std::invoke(std::forward<F>(f), error())
7,8) std::invoke(std::forward<F>(f), std::move(error()))

Возвращаемые значения определяются следующим образом:

Перегрузка Значение has_value()
true false
(1,2) std::expected<T, G>(std::in_place, val) std::expected<T, G>(std::unexpect, expr)
(3,4) std::expected<T, G>(std::in_place, std::move(val))
(5,6) std::expected<T, G>()
(7,8)

Примечания

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

Пример

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

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

Отчёт об ошибке Применён к Опубликованное поведение Корректное поведение
LWG 3938 C++23 ожидаемое значение получалось с помощью value()[1] изменено на **this
LWG 3973 C++23 ожидаемое значение получалось с помощью **this[2] изменено на val
  1. value() требует, чтобы E поддерживал конструирование копированием (см. отчёт LWG 3843), тогда как operator* этого не требует.
  2. **this может вызвать поиск с учётом аргументов.

См. также

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

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

Spec-Zone.ru

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