Spec-Zone.ru › C++

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.

1-4) f вызывается с ожидаемым значением val в качестве аргумента.
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
  1. value() требует, чтобы E был копируемо-конструируемым (см. LWG issue 3843), тогда как operator* этого не требует.
  2. **this может вызвать поиск с учётом аргументов.

См. также

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

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

Spec-Zone.ru

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