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, представляющий ожидаемое значение.
Зададим тип 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 |
-
value()требует, чтобыEможно было копирующе конструировать (см. отчёт LWG 3843), тогда какoperator*этого не требует. -
**thisможет инициировать поиск, зависящий от аргументов.
См. также
возвращает сам expected, если он содержит ожидаемое значение; в противном случае возвращает expected, содержащее преобразованное неожиданное значение (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/expected/or_else