Пространства имён
Варианты
Действия

std::unexpected

Материал из cppreference.com
< cpp‎ | utility‎ | expected
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
std::expected
Функции-элементы
Наблюдатели
Монадические операции
Модификаторы
Функции, не являющиеся элементами
Вспомогательные классы
unexpected
 
Определено в заголовочном файле <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 функция-элемент)
(деструктор)
(объявлено неявно) (C++23)
уничтожает объект unexpected вместе с сохранённым значением
(public функция-элемент)
operator=
(объявлено неявно) (C++23)
присваивает сохранённое значение
(public функция-элемент)
(C++23)
обращается к сохранённому значению
(public функция-элемент)
(C++23)
обменивает сохранённые значения
(public функция-элемент)

[править] Функции, не являющиеся элементами

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

std::unexpected::unexpected

constexpr unexpected( const unexpected& ) = default;
(1) (начиная с C++23)
constexpr unexpected( unexpected&& ) = default;
(2) (начиная с C++23)
template< class Err = E >
constexpr explicit unexpected( Err&& e );
(3) (начиная с C++23)
template< class... Args >
constexpr explicit unexpected( std::in_place_t, Args&&... args );
(4) (начиная с C++23)
template< class U, class... Args >

constexpr explicit unexpected( std::in_place_t,

                               std::initializer_list<U> il, Args&&... args );
(5) (начиная с C++23)

Создаёт объект 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;
(начиная с C++23)

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

std::unexpected::swap

constexpr void swap( unexpected& other ) noexcept(std::is_nothrow_swappable_v<E>);
(начиная с C++23)

Меняет местами сохранённые значения, как если бы 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 );
(начиная с C++23)

Сравнивает сохранённые значения, как если бы 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)));
(начиная с C++23)

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

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

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

[править] Правила вывода

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

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

[править] Примечание

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

[править] Пример

#include <expected>
#include <iostream>
 
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";
    }
}

Вывод:

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

[править] Пример с enum

#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()
{
    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 {};
    });
 
    return 0;
}

Вывод:

or_else: 1

[править] Смотрите также

создаёт объект expected
(public функция-элемент) [править]
сравнивает объекты expected
(шаблон функции) [править]