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, представляющий ожидаемое значение.
Пусть тип G определяется следующим образом:
Если выполняется хотя бы одно из следующих условий, программа некорректна:
-
Gне является допустимым аргументом шаблона дляstd::unexpected. - Следующее соответствующее объявление некорректно:
G g(std::invoke(std::forward<F>(f), error()));
G g(std::invoke(std::forward<F>(f), std::move(error()));
G g(std::invoke(std::forward<F>(f), error()));
G g(std::invoke(std::forward<F>(f), std::move(error()));
std::is_constructible_v<T, decltype((val))> является true.std::is_constructible_v<T, decltype(std::move(val))> является true.Параметры
| f | - | подходящая функция или объект Callable, сигнатура вызова которого возвращает тип, не являющийся ссылкой |
Возвращаемое значение
Пусть выражение expr определяется следующим образом:
std::invoke(std::forward<F>(f), error())
std::invoke(std::forward<F>(f), std::move(error()))
std::invoke(std::forward<F>(f), error())
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 |
-
value()требует, чтобыEподдерживал конструирование копированием (см. отчёт LWG 3843), тогда какoperator*этого не требует. -
**thisможет вызвать поиск с учётом аргументов.
См. также
возвращает сам expected, если он содержит ожидаемое значение; в противном случае возвращает результат применения заданной функции к неожиданному значению (открытая функция-член) |
|
возвращает expected, содержащий преобразованное ожидаемое значение, если оно существует; в противном случае возвращает сам expected (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/expected/transform_error