Namespaces
Variants

std:: unexpected

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

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

Программа является некорректной, если она инстанцирует unexpected с не-объектным типом, типом массива, специализацией std::unexpected или cv-квалифицированным типом.

Содержание

Параметры шаблона

E - тип неожиданного значения. Тип не должен быть массивом, не-объектным типом, специализацией std::unexpected или типом с cv-квалификаторами.

Функции-члены

конструирует объект unexpected
(public member function)
(destructor)
(implicitly declared)
уничтожает объект unexpected вместе с сохранённым значением
(public member function)
operator=
(implicitly declared)
присваивает сохранённое значение
(public member function)
получает доступ к сохранённому значению
(public member function)
обменивает сохранённые значения
(public member function)

Функции, не являющиеся членами класса

(C++23)
сравнивает хранимое значение
(шаблон функции)
специализирует алгоритм std::swap
(шаблон функции)

std::unexpected:: unexpected

constexpr unexpected ( const unexpected & ) = default ;
(1)
constexpr unexpected ( unexpected && ) = default ;
(2)
template < class Err = E >
constexpr explicit unexpected ( Err && e ) ;
(3)
template < class ... Args >
constexpr explicit unexpected ( std:: in_place_t , Args && ... args ) ;
(4)
template < class U, class ... Args >

constexpr explicit unexpected ( std:: in_place_t ,

std:: initializer_list < U > il, Args && ... args ) ;
(5)
**Примечание:** Весь код C++ внутри тегов ` ` сохранен без изменений, как и требовалось. HTML-разметка, атрибуты и номера версий (1)-(5) также остались нетронутыми.

Создает объект std::unexpected .

1,2) Конструктор копирования/перемещения. Копирует или перемещает сохраненное значение, соответственно.
3) Создает хранимое значение, как если бы прямая инициализация значения типа E из std:: forward < Err > ( e ) .
4) Создает хранимое значение, как если бы прямая инициализация значения типа E из аргументов std:: forward < Args > ( args ) ... .
  • Эта перегрузка участвует в разрешении перегрузки только если std:: is_constructible_v < E, Args... > равно true.
5) Создает хранимое значение, как если бы выполнялась прямая инициализация значения типа E из аргументов il, std:: forward < Args > ( args ) ... .

Параметры

e - значение, которым инициализируется содержащееся значение
args... - аргументы, которыми инициализируется содержащееся значение
il - список инициализации, которым инициализируется содержащееся значение

Исключения

Выбрасывает любое исключение, выбрасываемое конструктором E .

std::unexpected:: error

constexpr const E & error ( ) const & noexcept ;

constexpr E & error ( ) & noexcept ;
constexpr const E && error ( ) const && noexcept ;

constexpr E && error ( ) && noexcept ;

Возвращает ссылку на сохраненное значение.

std::unexpected:: swap

constexpr void swap ( unexpected & other ) noexcept ( std:: is_nothrow_swappable_v < E > ) ;

Обменивает сохраненные значения, как если бы с помощью using std:: swap ; swap ( error ( ) , other. error ( ) ) ; .

Программа является некорректной, если std:: is_swappable_v < E > имеет значение false.

operator== (std::unexpected)

template < class E2 >
friend constexpr bool operator == ( unexpected & x, std :: unexpected < E2 > & y ) ;

Сравнивает хранимые значения, как если бы return x. error ( ) == y. error ( ) .

Если выражение x. error ( ) == e. error ( ) не является корректно сформированным, или если его результат не конвертируется в bool , программа является некорректной.

Эта функция не видна при обычном неквалифицированном поиске или квалифицированном поиске , и может быть найдена только с помощью поиска, зависимого от аргументов , когда std::unexpected<E> является ассоциированным классом аргументов.

swap (std::unexpected)

friend constexpr void
swap ( unexpected & x, unexpected & y ) noexcept ( noexcept ( x. swap ( y ) ) ) ;

Эквивалентно x. swap ( y ) .

Эта перегрузка участвует в разрешении перегрузки только если std:: is_swappable_v < E > равно true.

Эта функция не видна для обычного неквалифицированного или квалифицированного поиска и может быть найдена только с помощью поиска, зависимого от аргументов , когда std::unexpected<E> является ассоциированным классом аргументов.

Руководства по выводу типа

template < class E >
unexpected ( E ) - > unexpected < E > ;
(начиная с C++23)

Для deduction guide предоставлен для unexpected чтобы разрешить выведение из аргумента конструктора.

Примечания

До C++17, имя std::unexpected обозначало функцию, вызываемую средой выполнения C++ при нарушении динамической спецификации исключений.

Пример

#include <expected>
#include <iostream>
enum class error
{
    compile_time_error,
    runtime_error
};
[[nodiscard]] auto unexpected_runtime_error() -> std::expected<int, error>
{
    return std::unexpected(error::runtime_error);
}
int main()
{
    std::expected<double, int> ex = std::unexpected(3);
    if (!ex)
        std::cout << "ex содержит значение ошибки\n";
    if (ex == std::unexpected(3))
        std::cout << "Значение ошибки равно 3\n";
    const auto e = unexpected_runtime_error();
    e.and_then([](const auto& e) -> std::expected<int, error>
    {
        std::cout << "and_then: " << int(e); // не выводится
        return {};
    })
    .or_else([](const auto& e) -> std::expected<int, error>
    {
        std::cout << "or_else: " << int(e); // выводит эту строку
        return {};
    });
}

Вывод:

ex содержит значение ошибки
Значение ошибки равно 3
or_else: 1

Смотрите также

конструирует объект expected
(public member function)
возвращает ожидаемое значение
(public member function)
обменивает содержимое
(public member function)
специализирует алгоритм std::swap
(function)
(C++23)
сравнивает объекты expected
(function template)