Spec-Zone.ru › C++

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

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

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

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

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

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

Если G не является специализацией std::expected или std::is_same_v<G::value_type, T> имеет значение false, программа некорректна.

1,2) Эти перегрузки участвуют в разрешении перегрузки только в том случае, если std::is_constructible_v<T, decltype((val))> имеет значение true.
3,4) Эти перегрузки участвуют в разрешении перегрузки только в том случае, если std::is_constructible_v<T, decltype(std::move(val))> имеет значение true.

Параметры

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

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

Перегрузка Значение has_value()
true false
(1,2) G(std::in_place, val) std::invoke(std::forward<F>(f), error())
(3,4) G(std::in_place, std::move(val)) std::invoke(std::forward<F>(f), std::move(error()))
(5,6) G() std::invoke(std::forward<F>(f), error())
(7,8) std::invoke(std::forward<F>(f), std::move(error()))

Примечания

Макрос проверки поддержки возможности Значение Стандарт Возможность
__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 может инициировать поиск, зависящий от аргументов.

См. также

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

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

Spec-Zone.ru

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