std:: expected
|
Определено в заголовочном файле
<expected>
|
||
|
template
<
class
T,
class
E
>
class expected ; |
(1) | (начиная с C++23) |
|
template
<
class
T,
class
E
>
требует
std::
is_void_v
<
T
>
|
(2) | (начиная с C++23) |
Шаблон класса
std::expected
предоставляет способ представления одного из двух значений:
ожидаемого
значения типа
T
или
неожиданного
значения типа
E
.
expected
никогда не бывает пустым.
expected
.
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)
|
обёртка, которая может содержать или не содержать объект
(шаблон класса) |