Namespaces
Variants

std:: expected

From cppreference.net
Utilities library
Определено в заголовочном файле <expected>
template < class T, class E >
class expected ;
(1) (начиная с C++23)
template < class T, class E >

требует 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
(шаблон функции)
специализирует алгоритм std::swap
(функция)

Вспомогательные классы

(C++23)
представлен как неожиданное значение
(шаблон класса)
исключение, указывающее на проверенный доступ к expected который содержит неожиданное значение
(шаблон класса)
тег для создания на месте неожиданного значения в 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)
обёртка, которая может содержать или не содержать объект
(шаблон класса)