std::expected<T,E>::expected
De cppreference.com
constexpr expected(); |
(1) | (desde C++23) |
constexpr expected( const expected& other ); |
(2) | (desde C++23) |
constexpr expected( expected&& other ) noexcept(/* véase más abajo */); |
(3) | (desde C++23) |
template< class U, class G > constexpr explicit(/* véase más abajo */) expected( const expected<U, G>& other ); |
(4) | (desde C++23) |
template< class U, class G > constexpr explicit(/* véase más abajo */) expected( expected<U, G>&& other ); |
(5) | (desde C++23) |
template< class U = std::remove_cv_t<T> > constexpr explicit(!std::is_convertible_v<U, T>) expected( U&& v ); |
(6) | (desde C++23) (T no es cv void) |
template< class G > constexpr explicit(!std::is_convertible_v<const G&, E>) expected( const std::unexpected<G>& e ); |
(7) | (desde C++23) |
template< class G > constexpr explicit(!std::is_convertible_v<G, E>) expected( std::unexpected<G>&& e ); |
(8) | (desde C++23) |
template< class... Args > constexpr explicit expected( std::in_place_t, Args&&... args ); |
(9) | (desde C++23) (T no es cv void) |
template< class U, class... Args > constexpr explicit expected( std::in_place_t, std::initializer_list<U> il, Args&&... args ); |
(10) | (desde C++23) (T no es cv void) |
constexpr explicit expected( std::in_place_t ) noexcept; |
(11) | (desde C++23) (T es cv void) |
template< class... Args > constexpr explicit expected( std::unexpect_t, Args&&... args ); |
(12) | (desde C++23) |
template< class U, class... Args > constexpr explicit expected( std::unexpect_t, std::initializer_list<U> il, Args&&... args ); |
(13) | (desde C++23) |
Construye un nuevo objeto expected.
1) Constructor por defecto. Si
T no es (posiblemente calificada-cv void, construye un objeto que contiene un valor esperado, que es valor-inicializado. Después de la construcción,
has_value() devuelve true. Esta sobrecarga solo participa en la resolución de sobrecargas si
T es (posiblemente calificada-cv) void o std::is_default_constructible_v<T> es true.2) Constructor de copia. Si
other.has_value() es false, el nuevo objeto contiene un valor no esperado, que es directamente-inicializado a partir de other.error(). De lo contrario, si T no es (posiblemente calificada-cv void, el nuevo objeto contiene un valor esperado, que es directamente-inicializado a partir de *other. Después de la construcción,
has_value() es igual a other.has_value(). Este constructor se define como eliminado a menos que
- ya sea
Tes (posiblemente calificada-cv)void, ostd::is_copy_constructible_v<T>estrue, y std::is_copy_constructible_v<E>estrue.
Este constructor es trivial si
- ya sea
Tes (posiblemente calificada-cv)void, ostd::is_trivially_copy_constructible_v<T>estrue, y std::is_trivially_copy_constructible_v<E>estrue.
3) Constructor por movimiento. Si
other.has_value() es false, el nuevo objeto contiene un valor no esperado, que es directamente-inicializado a partir de std::move(other.error()). De lo contrario, si T no es (posiblemente calificada-cv void, el nuevo objeto contiene un valor esperado, que es directamente-inicializado a partir de std::move(*other). Después de la construcción,
has_value() es igual a other.has_value(). Este constructor participa en la resolución de sobrecarga sólo si
- ya sea
Tes (posiblemente calificada-cv)void, ostd::is_move_constructible_v<T>estrue, y std::is_move_constructible_v<E>estrue.
Este constructor es trivial si
std::is_trivially_move_constructible_v<T>estrue, ystd::is_trivially_move_constructible_v<E>estrue.
4,5) Sea
UFstd::add_lvalue_reference_t<const U>para (4) yUpara (5), yGFconst G¶ (4) yGpara (5).
Si
other.has_value() es false, el nuevo objeto contiene un valor no esperado, que es directamente-inicializado a partir de std::forward<GF>(other.error()). De lo contrario, si T no es (posiblemente calificada-cv void, el nuevo objeto contiene un valor esperado, que es directamente-inicializado a partir de std::forward<UF>(*other). Después de la construcción,
has_value() es igual a other.has_value(). Cada uno de estos constructores no participa en la resolución de sobrecarga a menos que se cumplan, respectivamente, las siguientes condiciones:
- Ya sea
Tes (posiblemente calificada-cv)void, ystd::is_void_v<U>estrue, ostd::is_constructible_v<T, UF>estrue.
std::is_constructible_v<E, GF>estrue.- Si
Tno es (posiblemente calificada-cvbool,Tno es construible o convertible a partir de cualquier expresión de tipo (posiblementeconst)std::expected<U, G>, es decir, los siguientes 8 valores son todosfalse: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>no es construible a partir de cualquier expresión de tipo (posiblementeconst)std::expected<U, G>, es decir, los siguientes 4 valores son todosfalse: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>
Estos constructores son
explicit si std::is_convertible_v<UF, T> o std::is_convertible_v<GF, E> es false.6) Construye un objeto que contiene un valor esperado, inicializado como si directamente-inicializando (pero no directamente-inicializando-por-lista) un objeto de tipo
T con la expresión std::forward<U>(v). Después de la construcción,
has_value() devuelve true. Este constructor no participa en la resolución de sobrecarga a menos que se cumplan las siguientes condiciones.:
Tno es (posiblemente calificada-cvvoid.std::is_same_v<std::remove_cvref_t<U>, std::in_place_t>esfalse.std::is_same_v<expected, std::remove_cvref_t<U>>esfalse.std::is_constructible_v<T, U>estrue.std::remove_cvref_t<U>no es una especialización destd::unexpected.- Si
Tes (posiblemente calificada-cv)bool,std::remove_cvref_t<U>no es una especialización destd::expected.
7,8) Sea
GF const G& para (7) y G para (8).
Construye un objeto que contiene un valor no esperado, que es directamente-inicializado a partir de std::forward<GF>(e.error()). Después de la construcción,
has_value() devuelve false. Estas sobrecargas solo participan en la resolución de sobrecargas si
std::is_constructible_v<E, GF> es true.9) Construye un objeto que contiene un valor esperado, que es directamente-inicializado a partir de los argumentos
std::forward<Args>(args).... Después de la construcción,
has_value() devuelve true. Esta sobrecarga solo participa en la resolución de sobrecargas si
std::is_constructible_v<T, Args...> es true.10) Construye un objeto que contiene un valor esperado, que es directamente-inicializado a partir de los argumentos
il, std::forward<Args>(args).... Después de la construcción,
has_value() devuelve true. Esta sobrecarga solo participa en la resolución de sobrecargas si
std::is_constructible_v<T, std::initializer_list<U>&, Args...> es true.12) Construye un objeto que contiene un valor no esperado, que es directamente-inicializado a partir de los argumentos
std::forward<Args>(args).... Después de la construcción,
has_value() devuelve false. Esta sobrecarga solo participa en la resolución de sobrecargas si
std::is_constructible_v<E, Args...> es true.13) Construye un objeto que contiene un valor no esperado, que es directamente-inicializado a partir de los argumentos
il, std::forward<Args>(args).... Después de la construcción,
has_value() devuelve false. Esta sobrecarga solo participa en la resolución de sobrecargas si
std::is_constructible_v<E, std::initializer_list<U>&, Args...> es true.Parámetros
| other | - | Otro objeto expected cuyo valor contenido se copia.
|
| e | - | Objeto std::unexpected cuyo valor contenido se copia.
|
| v | - | Valor con el que inicializar el valor contenido. |
| args... | - | Argumentos con los que inicializar el valor contenido. |
| il | - | Lista de inicializadores con la que inicializar el valor contenido. |
Excepciones
1) Lanza cualquier excepción lanzada por el constructor de
T.2) Lanza cualquier excepción lanzada por el constructor de
T o E.3) Si
T es (posiblemente calificada-cv) void,
De lo contrario,
Especificación noexcept: (desde C++11)
noexcept(std::is_nothrow_move_constructible_v<T> && std::is_nothrow_move_constructible_v<E>) |
||
4,5) Lanza cualquier excepción lanzada por el constructor de
T o E.6) Lanza cualquier excepción lanzada por el constructor de
T.7,8) Lanza cualquier excepción lanzada por el constructor de
E.9,10) Lanza cualquier excepción lanzada por el constructor de
T.12,13) Lanza cualquier excepción lanzada por el constructor de
E.Ejemplo
| Esta sección está incompleta Razón: sin ejemplo |
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 3886 | C++23 | El argumento de plantilla por defecto de la sobrecarga (6) era T.
|
Se cambió a std::remove_cv_t<T>.
|
Véase también
(C++23) |
Representado como un valor no esperado. (plantilla de clase) |
| Etiqueta de construcción en el sitio (in situ). (plantilla de clase) | |
(C++23) |
Etiqueta de construcción in situ para un valor no esperado en expected.(tag) |