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) |
Если *this содержит ожидаемое значение, вызывает f и возвращает его результат; в противном случае возвращает объект std::expected, содержащий копию error().
Если T не является (возможно, с квалификаторами cv) void, содержащееся ожидаемое значение (полученное из operator*) передается в качестве аргумента в f; в противном случае f не принимает аргументов.
U задаётся как - std::remove_cvref_t<std::invoke_result_t<F>> если
Tявляется (возможно, с квалификаторами cv) void, или - std::remove_cvref_t<std::invoke_result_t<F, decltype(**this)>> в противном случае.
Если
U не является специализацией std::expected, или std::is_same_v<U::error_type, E> является false, программа является некорректной.
Эффект эквивалентен
if (has_value())
{
if constexpr (std::is_void_v<T>)
return std::invoke(std::forward<F>(f));
else
return std::invoke(std::forward<F>(f), **this);
}
else
return U(std::unexpect, error());
Эти перегрузки участвуют в решении перегрузки только если
3,4) Тип std::is_constructible_v<E, decltype(error())> является true.U задаётся как - std::remove_cvref_t<std::invoke_result_t<F>> если
Tявляется (возможно, с квалификаторами cv) void, или - std::remove_cvref_t<std::invoke_result_t<F, decltype(std::move(**this))>> в противном случае.
Если
U не является специализацией std::expected, или std::is_same_v<U::error_type, E> является false, программа является некорректной.
Эффект эквивалентен
if (has_value())
{
if constexpr (std::is_void_v<T>)
return std::invoke(std::forward<F>(f));
else
return std::invoke(std::forward<F>(f), std::move(**this));
}
else
return U(std::unexpect, std::move(error()));
Эти перегрузки участвуют в решении перегрузки только если
std::is_constructible_v<E, decltype(std::move(error()))> является true.Параметры
| f | - | подходящий объект функции или Callable, который возвращает std::expected |
Возвращаемое значение
Результат f или объект std::expected, содержащий значение ошибки, как описано выше.
Примечания
| Макросы проверки возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_expected | 202211L | (C++23) | Моноидные функции для std::expected |
Пример
Отчёты о дефектах
Следующие отчёты о дефектах, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применимо к | Поведение, опубликованное ранее | Корректное поведение |
|---|---|---|---|
| LWG 3938 | C++23 |
and_then было некорректным, если T не является (возможно,с квалификаторами cv) void и E не является копируемым | сделано корректным |
См. также
|
(C++23) | метка для создания объекта unexpected в expected(метка) |
возвращает expected, содержащий преобразованное ожидаемое значение, если оно существует; в противном случае возвращает исходный expected(публичный член-функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/expected/and_then