std::optional<T>::optional
constexpr optional() noexcept;
constexpr optional( std::nullopt_t ) noexcept;
|
(1) | (desde C++17) |
constexpr optional( const optional& other );
|
(2) | (desde C++17) |
constexpr optional( optional&& other ) noexcept(/* see below */);
|
(3) | (desde C++17) |
template < class U >
optional( const optional<U>& other );
|
(4) | (desde C++17) (constexpr desde C++20) (condicionalmente explícito) |
template < class U >
optional( optional<U>&& other );
|
(5) | (desde C++17) (constexpr desde C++20) (condicionalmente explícito) |
template< class... Args >
constexpr explicit optional( std::in_place_t, Args&&... args );
|
(6) | (desde C++17) |
template< class U, class... Args >
constexpr explicit optional( std::in_place_t,
std::initializer_list<U> ilist,
Args&&... args );
|
(7) | (desde C++17) |
template < class U = std::remove_cv_t<T> >
constexpr optional( U&& value );
|
(8) | (desde C++17) (condicionalmente explícito) |
Construye un nuevo objeto optional.
other contiene un valor, inicializa el valor contenido como si inicializara directamente (pero no mediante inicialización directa de lista) un objeto de tipo T con la expresión *other. Si other no contiene un valor, construye un objeto que no contiene un valor.
- Este constructor se define como eliminado si
std::is_copy_constructible_v<T>esfalse. - Es un constructor trivial si
std::is_trivially_copy_constructible_v<T>estrue.
other contiene un valor, inicializa el valor contenido como si inicializara directamente (pero no mediante inicialización directa de lista) un objeto de tipo T con la expresión std::move(*other) y no hace que other esté vacío: un std::optional movido todavía contiene un valor, pero el valor en sí mismo ha sido movido. Si other no contiene un valor, construye un objeto que no contiene un valor.
- Este constructor no participa en la resolución de sobrecarga a menos que
std::is_move_constructible_v<T>seatrue. - Es un constructor trivial si
std::is_trivially_move_constructible_v<T>estrue.
other no contiene un valor, construye un objeto optional que no contiene un valor. En caso contrario, construye un objeto optional que contiene un valor, inicializado como si inicializara directamente (pero no mediante inicialización directa de lista) un objeto de tipo T con la expresión *other.
- Este constructor no participa en la resolución de sobrecarga a menos que se cumplan las siguientes condiciones:
std::is_constructible_v<T, const U&>estrue.- Si
Tno es (posiblemente cv-cualificado)bool,Tno es construible ni convertible desde ninguna expresión de tipo (posiblementeconst)std::optional<U>, es decir,converts_from_any_cvref<T, std::optional<U>>esfalse, dondeconverts_from_any_cvrefse describe a continuación.
- Este constructor es
explicitsi y solo sistd::is_convertible_v<const U&, T>esfalse.
other no contiene un valor, construye un objeto optional que no contiene un valor. En caso contrario, construye un objeto optional que contiene un valor, inicializado como si inicializara directamente (pero no mediante inicialización directa de lista) un objeto de tipo T con la expresión std::move(*other).
- Este constructor no participa en la resolución de sobrecarga a menos que se cumplan las siguientes condiciones:
std::is_constructible_v<T, U&&>estrue.- Si
Tno es (posiblemente cv-cualificado)bool,Tno es construible ni convertible desde ninguna expresión de tipo (posiblementeconst)std::optional<U>, es decir,converts_from_any_cvref<T, std::optional<U>>esfalse, dondeconverts_from_any_cvrefse describe a continuación.
- Este constructor es
explicitsi y solo sistd::is_convertible_v<U&&, T>esfalse.
T a partir de los argumentos std::forward<Args>(args)....
- Si el constructor seleccionado de
Tes un constructorconstexpr, este constructor es un constructorconstexpr. - La función no participa en la resolución de sobrecarga a menos que
std::is_constructible_v<T, Args...>seatrue.
T a partir de los argumentos ilist, std::forward<Args>(args)....
- Si el constructor seleccionado de
Tes un constructorconstexpr, este constructor es un constructorconstexpr. - La función no participa en la resolución de sobrecarga a menos que
std::is_constructible_v<T, std::initializer_list<U>&, Args...>seatrue.
T con la expresión std::forward<U>(value).
- Si el constructor seleccionado de
Tes un constructorconstexpr, este constructor es un constructorconstexpr. - Este constructor no participa en la resolución de sobrecarga a menos que se cumplan las siguientes condiciones:
std::is_constructible_v<T, U&&>estrue.std::decay_t<U>(hasta C++20)std::remove_cvref_t<U>(desde C++20) no es ni std::in_place_t nistd::optional<T>.- Si
Tes (posiblemente cv-cualificado)bool,std::decay_t<U>(hasta C++20)std::remove_cvref_t<U>(desde C++20) no es una especialización destd::optional.
- Este constructor es
explicitsi y solo sistd::is_convertible_v<U&&, T>esfalse.
La plantilla de variable auxiliar converts_from_any_cvref es equivalente a:
template< class T, class W >
constexpr bool converts_from_any_cvref =
std::disjunction_v<std::is_constructible<T, W&>, std::is_convertible<W&, T>,
std::is_constructible<T, W>, std::is_convertible<W, T>,
std::is_constructible<T, const W&>, std::is_convertible<const W&, T>,
std::is_constructible<T, const W>, std::is_convertible<const W, T>>;
Parámetros
| other | - |
otro objeto optional cuyo valor contenido es copiado
|
| value | - | valor con el cual inicializar el valor contenido |
| args... | - | argumentos con los cuales inicializar el valor contenido |
| ilist | - | lista de inicialización con la cual inicializar el valor contenido |
Excepciones
T
.
T
. Tiene la siguiente
T
.
Notas
Antes de la resolución de
LWG issue 3836
, construir un
std::
optional
<
bool
>
desde
std::
optional
<
U
>
seleccionaría la sobrecarga
(
9
)
en lugar de las sobrecargas
(
5,6
)
si
U
no es
bool
. Esto se debe a que las sobrecargas
(
5,6
)
no participaban en la resolución de sobrecarga si
T
(
bool
en este caso) puede ser construido o convertido desde
std::
optional
<
U
>
, pero
std::optional::operator bool
hace posible la conversión para cualquier
U
.
Como resultado, el std:: optional < bool > construido siempre contiene un valor. Ese valor se determina por si el objeto std:: optional < U > proporcionado contiene un valor, en lugar del valor bool inicializado directamente desde el valor contenido:
std::optional<bool> op_false(false); std::optional<int> op_zero(0); std::optional<int> from_bool(op_false); // OK: contiene 0 (inicializado desde false) std::optional<bool> from_int(op_zero); // DEFECTO (LWG 3836): contiene true porque // op_zero contiene un valor, incluso si inicializar // bool desde ese valor da false
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_optional
|
202106L
|
(C++20)
(DR20) |
Completamente constexpr ( 5,6 ) |
Ejemplo
#include <iostream> #include <optional> #include <string> int main() { std::optional<int> o1, // vacío o2 = 1, // inicializado desde valor R o3 = o2; // constructor de copia // llama al constructor std::string( initializer_list<CharT> ) std::optional<std::string> o4(std::in_place, {'a', 'b', 'c'}); // llama al constructor std::string( size_type count, CharT ch ) std::optional<std::string> o5(std::in_place, 3, 'A'); // Construido por movimiento desde std::string usando guía de deducción para seleccionar el tipo std::optional o6(std::string{"deduction"}); std::cout << *o2 << ' ' << *o3 << ' ' << *o4 << ' ' << *o5 << ' ' << *o6 << '\n'; }
Salida:
1 1 abc AAA deduction
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Se aplica a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 3836 | C++17 |
al construir un
std::
optional
<
bool
>
desde std:: optional < U > , la resolución de sobrecarga seleccionaría la sobrecarga ( 9 ) si
U
no es
bool
|
siempre selecciona el
constructor de copia/movimiento de conversión en este caso |
| LWG 3886 | C++17 |
el argumento de plantilla por defecto de la sobrecarga
(
9
)
era
T
|
cambiado a std:: remove_cv_t < T > |
| P0602R4 | C++17 |
los constructores de copia/movimiento podrían no ser triviales
incluso si el constructor subyacente es trivial |
requerido para
propagar trivialidad |
| P2231R1 | C++20 |
las sobrecargas
(
5,6
)
desde otro
std::optional
no eran
constexpr
|
convertidas en constexpr |
Véase también
|
(C++17)
|
crea un objeto
optional
(plantilla de función) |