std::expected<T,E>::and_then
| Основной шаблон | ||
template< class F > constexpr auto and_then( F&& f ) &; | (1) | (начиная с C++23) |
template< class F > constexpr auto and_then( F&& f ) const&; | (2) | (начиная с C++23) |
template< class F > constexpr auto and_then( F&& f ) &&; | (3) | (начиная с C++23) |
template< class F > constexpr auto and_then( F&& f ) const&&; | (4) | (начиная с C++23) |
| частичная специализация void | ||
template< class F > constexpr auto and_then( F&& f ) &; | (5) | (начиная с C++23) |
template< class F > constexpr auto and_then( F&& f ) const&; | (6) | (начиная с C++23) |
template< class F > constexpr auto and_then( F&& f ) &&; | (7) | (начиная с C++23) |
template< class F > constexpr auto and_then( F&& f ) const&&; | (8) | (начиная с C++23) |
Если *this представляет ожидаемое значение, вызывает f и возвращает результат. В противном случае возвращает объект std::expected, содержащий неожиданное значение, инициализированный неожиданным значением из *this.
5-8)
f вызывается без аргументов.Пусть тип U имеет следующий вид:
1,2) std::remove_cvref_t<std::invoke_result_t<F,decltype((
val))>>
3,4) std::remove_cvref_t<std::invoke_result_t<F,decltype(std::move(
val))>>
5-8) std::remove_cvref_t<std::invoke_result_t<F>>
Если U не является специализацией std::expected или std::is_same_v<U::error_type, E> имеет значение false, программа некорректна.
1,2) Эти перегрузки участвуют в разрешении перегрузки только в том случае, если
std::is_constructible_v<E, decltype(error())> имеет значение true.
3,4) Эти перегрузки участвуют в разрешении перегрузки только в том случае, если
std::is_constructible_v<E, decltype(std::move(error()))> имеет значение true.
5,6) Эти перегрузки участвуют в разрешении перегрузки только в том случае, если
std::is_constructible_v<E, decltype(error())> имеет значение true.
7,8) Эти перегрузки участвуют в разрешении перегрузки только в том случае, если
std::is_constructible_v<E, decltype(std::move(error()))> имеет значение true.Параметры
| f | - | подходящая функция или объект Callable, возвращающий std::expected |
Возвращаемое значение
| Перегрузка | Значение has_value() |
|
|---|---|---|
true |
false |
|
| (1,2) |
std::invoke(std::forward<F>(f), val) |
U(std::unexpect, error()) |
| (3,4) |
std::invoke(std::forward<F>(f),std::move(val)) |
U(std::unexpect, std::move(error())) |
| (5,6) |
std::invoke(std::forward<F>(f)) |
U(std::unexpect, error()) |
| (7,8) |
U(std::unexpect, std::move(error())) |
|
Примечания
| Макрос проверки поддержки | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_expected | 202211L | (C++23) | Монадические функции для std::expected |
Пример
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применяется к | Опубликованное поведение | Исправленное поведение |
|---|---|---|---|
| LWG 3938 | C++23 | ожидаемое значение получалось с помощью value()[1] | изменено на **this |
| LWG 3973 | C++23 | ожидаемое значение получалось с помощью **this[2] | изменено на val |
-
value()требует, чтобыEбыл копируемо-конструируемым (см. LWG issue 3843), тогда какoperator*этого не требует. -
**thisможет вызвать поиск с учётом аргументов.
См. также
|
(C++23) | тег для конструирования на месте неожиданного значения в expected(тег) |
возвращает expected, содержащий преобразованное ожидаемое значение, если оно существует; в противном случае возвращает expected без изменений (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/expected/and_then