std::expected<T,E>::expected — cppreference.com
Материал из cppreference.com
<tbody> </tbody>
|
|
(1) | (начиная с C++23) |
|
|
(2) | (начиная с C++23) |
|
|
(3) | (начиная с C++23) |
|
|
(4) | (начиная с C++23) |
|
|
(5) | (начиная с C++23) |
|
|
(6) | (начиная с C++23) (T не является cv void) |
|
|
(7) | (начиная с C++23) |
|
|
(8) | (начиная с C++23) |
|
|
(9) | (начиная с C++23) (T не является cv void) |
|
|
(10) | (начиная с C++23) (T не является cv void) |
|
|
(11) | (начиная с C++23) (T является cv void) |
|
|
(12) | (начиная с C++23) |
|
|
(13) | (начиная с C++23) |
Создаёт новый объект expected.
1) Конструктор по умолчанию. Если T не является (возможно, cv-квалифицированным) void, создаёт объект, содержащий ожидаемое значение, которое инициализируется значением.
После создания, has_value() возвращает значение true.
- Эта перегрузка участвует в разрешении перегрузки, только если
Tравно (возможно, cv-квалифицированному)voidилиstd::is_default_constructible_v<T>равноtrue.
2) Конструктор копирования. Если other.has_value() имеет значение false, новый объект содержит неожидаемое значение, которое инициализируется напрямую из other.error(). Иначе, если T не является (возможно, cv-квалифицированным) void, новый объект содержит ожидаемое значение, которое напрямую инициализируется из *other.
После создания has_value() равно other.has_value().
- Этот конструктор определяется как удалённый, если только
- либо
Tявляется (возможно, cv-квалифицированным)void, илиstd::is_copy_constructible_v<T>равноtrue, и std::is_copy_constructible_v<E>равноtrue.
- либо
- Этот конструктор тривиален, если
- либо
Tявляется (возможно, cv-квалифицированным)void, илиstd::is_trivially_copy_constructible_v<T>равноtrue, и std::is_trivially_copy_constructible_v<E>равноtrue.
- либо
3) Конструктор перемещения. Если other.has_value() равно {c|false}}, новый объект содержит неожидаемое значение, которое напрямую инициализируется из std::move(other.error()). Иначе, если T не является (возможно, cv-квалифицированным) void, новый объект содержит ожидаемое значение, которое напрямую инициализируется из std::move(*other).
После создания has_value() равно other.has_value().
- Этот конструктор участвует в разрешении перегрузки, только если
- либо
Tявляется (возможно, cv-квалифицированным)void, илиstd::is_move_constructible_v<T>равноtrue, и std::is_move_constructible_v<E>равноtrue.
- либо
- Этот конструктор тривиален, если
std::is_trivially_move_constructible_v<T>равноtrue, иstd::is_trivially_move_constructible_v<E>равноtrue.
4,5) Пусть
UFбудетstd::add_lvalue_reference_t<const U>для (4) иUдля (5), иGFбудетconst G&для (4) иGдля (5).
Если other.has_value() имеет значение false, новый объект содержит неожидаемое значение, которое напрямую инициализируется из std::forward<GF>(other.error()). Иначе, если T не является (возможно, cv-квалифицированным) void, новый объект содержит ожидаемое значение, которое напрямую инициализируется из std::forward<UF>(*other).
После создания has_value() равно other.has_value().
- Каждый из этих конструкторов не участвует в разрешении перегрузки, если не выполняются следующие условия:
- или
Tравно (возможно, cv-квалифицированному)void, иstd::is_void_v<U>равноtrue, илиstd::is_constructible_v<T, UF>равноtrue, и
std::is_constructible_v<E, GF>равноtrue, и- Если
Tне является (возможно, cv-квалифицированнымbool),Tнельзя построить или преобразовать из любого выражения типа (возможно,const)std::expected<U, G>, т.е. все следующие 8 значений равныfalse:std::is_constructible_v<T, std::expected<U, G>&std::is_constructible_v<T, std::expected<U, G>std::is_constructible_v<T, const std::expected<U, G>&std::is_constructible_v<T, const std::expected<U, G>std::is_convertible_v<std::expected<U, G>&, T>std::is_convertible_v<std::expected<U, G>, T>std::is_convertible_v<const std::expected<U, G>&, T>std::is_convertible_v<const std::expected<U, G>, T>
std::unexpected<E>не может быть построен ни из какого выражения типа (возможно,const)std::expected<U, G>, то есть все следующие 4 значенияfalse:false:std::is_constructible_v<std::unexpected<E>, std::expected<U, G>&std::is_constructible_v<std::unexpected<E>, std::expected<U, G>std::is_constructible_v<std::unexpected<E>, const std::expected<U, G>&std::is_constructible_v<std::unexpected<E>, const std::expected<U, G>
- или
- Эти конструкторы являются
explicit, еслиstd::is_convertible_v<UF, T>илиstd::is_convertible_v<GF, E>равноfalse.
6) Создаёт объект, который содержит ожидаемое значение, инициализированное как при прямой инициализации (но не прямой инициализацией списком) объекта типа T с выражением std::forward<U>(v).
После создания has_value() возвращает true.
- Этот конструктор не участвует в разрешении перегрузки, если не выполняются следующие условия:
Tне является (возможно, cv-квалифицированным)void, иstd::is_same_v<std::remove_cvref_t<U>, std::in_place_t>равноfalse, иstd::is_same_v<expected, std::remove_cvref_t<U>>равноfalse, иstd::is_constructible_v<T, U>равноtrue.std::remove_cvref_t<U>не является специализациейstd::unexpected.- Если
Tявляется (возможно, cv-квалифицированным)bool,std::remove_cvref_t<U>не является специализациейstd::expected.
7,8) Пусть GF будет const G& для (7) и G для (8).
Создаёт объект, содержащий неожидаемое значение, которое напрямую инициализируется из std::forward<GF>(e.error()).
После создания has_value() возвращает false.
- Эти перегрузки участвуют в разрешении перегрузки, только если
std::is_constructible_v<E, GF>равноtrue.
9) Создаёт объект, содержащий ожидаемое значение, которое напрямую инициализируется из аргументов std::forward<Args>(args)....
После создания has_value() возвращает true.
- Эта перегрузка участвует в разрешении перегрузки, только если
std::is_constructible_v<T, Args...>равноtrue.
10) Создаёт объект, содержащий ожидаемое значение, которое напрямую инициализируется из аргументов il, std::forward<Args>(args)....
После создания has_value() возвращает true.
- Эта перегрузка участвует в разрешении перегрузки, только если
std::is_constructible_v<T, std::initializer_list<U>&, Args...>равноtrue.
11) Создаёт объект таким образом, что после создания has_value() возвращает true.
12) Создаёт объект, содержащий неожидаемое значение, которое напрямую инициализируется из аргументов il, std::forward<Args>(args)....
После создания has_value() возвращает true.
- Эта перегрузка участвует в разрешении перегрузки, только если
std::is_constructible_v<E, Args...>равноtrue.
13) Создаёт объект, содержащий неожидаемое значение, которое напрямую инициализируется из аргументов il, std::forward<Args>(args)....
После создания has_value() возвращает false.
- Эта перегрузка участвует в разрешении перегрузки, только если
std::is_constructible_v<E, std::initializer_list<U>&, Args...>равноtrue.
Параметры
| other | — | другой объект expected, содержащееся в котором значение копируется
|
| e | — | std::unexpected, содержащееся в котором значение копируется
|
| v | — | значение для инициализации содержащегося значения |
| args... | — | аргументы для инициализации содержащегося значения |
| il | — | список инициализаторов для инициализации содержащегося значения |
Исключения
1) Генерирует любое исключение, созданное конструктором T.
Если T является (возможно, cv-квалифицированным) void,
2) Генерирует любое исключение, созданное конструктором T или E.
3) Если T является (возможно, cv-квалифицированным) void,
Иначе
спецификация
noexcept:
noexcept(std::is_nothrow_move_constructible_v<T> && std::is_nothrow_move_constructible_v<E>)
4,5) Генерирует любое исключение, созданное конструктором T или E.
6) Генерирует любое исключение, созданное конструктором T.
7-8) Генерирует любое исключение, созданное конструктором E.
9-10) Генерирует любое исключение, созданное конструктором T.
12,13) Генерирует любое исключение, созданное конструктором E.