std::expected
От ru.cppreference.net
| Определён в заголовке <expected>
|
||
template< class T, class E >
class expected;
|
(1) | (начиная с C++23) |
template< class T, class E >
requires std::is_void_v<T>
class expected<T, E>;
|
(2) | (начиная с C++23) |
Шаблон класса std::expected предоставляет способ представления одного из двух значений: ожидаемого значения типа T или неожиданного значения типа E. expected никогда не бывает без значения.
1) Основной шаблон. Содержит ожидаемое или неожиданное значение в собственном хранилище, которое вложено внутрь объекта
expected.2) Частичная специализация
void. Представляет ожидаемое значение void или содержит неожиданное значение. Если оно содержит неожиданное значение, оно вложено внутрь объекта expected.Программа является некорректной, если она инстанцирует expected с ссылочным типом, типом функции или специализацией std::unexpected. Кроме того, T не должен быть std::in_place_t или std::unexpect_t.
Параметры шаблона
| T | - | тип ожидаемого значения. Тип должен быть либо (возможно, cv-квалифицированным) void , либо удовлетворять требованиям Destructible (в частности, массивы и ссылочные типы не допускаются). |
| E | - | тип неожиданного значения. Тип должен удовлетворять требованиям Destructible и должен быть допустимым шаблонным аргументом для std::unexpected (в частности, массивы, не-объектные типы и cv-квалифицированные типы не допускаются). |
Вложенные типы
| Тип | Определение |
value_type
|
T
|
error_type
|
E
|
unexpected_type
|
std::unexpected<E>
|
Шаблоны-члены
| Шаблон | Определение |
| rebind < U > | std :: expected < U, error_type > |
Члены данных
| Член | Описание |
bool
has_val
|
представляет ли объект
expected
в настоящее время ожидаемое значение
( объект только для демонстрации* ) |
T
val
(только основной шаблон)
|
ожидаемое значение
( вариант объекта только для демонстрации* ) |
E
unex
|
неожиданное значение
( вариант объекта только для демонстрации* ) |
Функции-члены
конструирует объект
expected
(public member function) |
|
уничтожает объект
expected
вместе с содержащимся значением
(public member function) |
|
|
присваивает содержимое
(public member function) |
|
Наблюдатели |
|
|
получает доступ к ожидаемому значению
(public member function) |
|
|
проверяет, содержит ли объект ожидаемое значение
(public member function) |
|
|
возвращает ожидаемое значение
(public member function) |
|
|
возвращает неожиданное значение
(public member function) |
|
|
возвращает ожидаемое значение, если оно присутствует, иначе другое значение
(public member function) |
|
|
возвращает неожиданное значение, если оно присутствует, иначе другое значение
(public member function) |
|
Монадические операции |
|
возвращает результат заданной функции от ожидаемого значения, если оно существует; иначе возвращает сам
expected
(public member function) |
|
возвращает
expected
содержащий преобразованное ожидаемое значение, если оно существует; иначе возвращает сам
expected
(public member function) |
|
возвращает сам
expected
если он содержит ожидаемое значение; иначе возвращает результат заданной функции от неожиданного значения
(public member function) |
|
возвращает сам
expected
если он содержит ожидаемое значение; иначе возвращает
expected
содержащий преобразованное неожиданное значение
(public member function) |
|
Модификаторы |
|
|
конструирует ожидаемое значение на месте
(public member function) |
|
|
обменивает содержимое
(public member function) |
|
Функции, не являющиеся членами класса
|
(C++23)
|
сравнивает объекты
expected
(шаблон функции) |
|
(C++23)
|
специализирует алгоритм
std::swap
(функция) |
Вспомогательные классы
|
(C++23)
|
представлен как неожиданное значение
(шаблон класса) |
|
(C++23)
|
исключение, указывающее на проверенный доступ к
expected
который содержит неожиданное значение
(шаблон класса) |
|
(C++23)
|
тег для создания на месте неожиданного значения в
expected
(тег) |
Примечания
Типы с одинаковой функциональностью называются
Result
в Rust и
Either
в Haskell.
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_expected
|
202202L
|
(C++23) |
Шаблон класса
std::expected
и связанные
вспомогательные классы
|
202211L
|
(C++23) |
Монадные функции для
std::expected
|
Пример
Запустить этот код
#include <cmath> #include <expected> #include <iomanip> #include <iostream> #include <string_view> enum class parse_error { invalid_input, overflow }; auto parse_number(std::string_view& str) -> std::expected<double, parse_error> { const char* begin = str.data(); char* end; double retval = std::strtod(begin, &end); if (begin == end) return std::unexpected(parse_error::invalid_input); else if (std::isinf(retval)) return std::unexpected(parse_error::overflow); str.remove_prefix(end - begin); return retval; } int main() { auto process = [](std::string_view str) { std::cout << "str: " << std::quoted(str) << ", "; if (const auto num = parse_number(str); num.has_value()) std::cout << "value: " << *num << '\n'; // Если num не имеет значения, разыменование num // вызовет неопределенное поведение, и // num.value() выбросит std::bad_expected_access. // num.value_or(123) использует указанное значение по умолчанию 123. else if (num.error() == parse_error::invalid_input) std::cout << "error: invalid input\n"; else if (num.error() == parse_error::overflow) std::cout << "error: overflow\n"; else std::cout << "unexpected!\n"; // или вызвать std::unreachable(); }; for (auto src : {"42", "42abc", "meow", "inf"}) process(src); }
Вывод:
str: "42", value: 42 str: "42abc", value: 42 str: "meow", error: invalid input str: "inf", error: overflow
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 4141 | C++23 |
требование к выделению памяти
было неясным |
содержащийся объект должен быть
вложен в объект
expected
|
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
-
- 22.8 Объекты Expected [expected]
Смотрите также
|
(C++17)
|
типобезопасное размеченное объединение
(шаблон класса) |
|
(C++17)
|
обёртка, которая может содержать или не содержать объект
(шаблон класса) |