std::optional<T>::optional
De cppreference.com
<tbody>
</tbody>
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(/* véase más abajo */); |
(3) | (desde C++17) |
template < class U > optional( const optional<U>& other ); |
(4) | (desde C++17) (condicionalmente explicit) |
template < class U > optional( optional<U>&& other ); |
(5) | (desde C++17) (condicionalmente explicit) |
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 = value_type > constexpr optional( U&& value ); |
(8) | (desde C++17) (condicionalmente explicit) |
Construye un nuevo objeto optional.
1) Construye un objeto que no contiene un valor.
2) Constructor de copia: Si
other contiene un valor, inicializa el valor contenido como si se inicilizara directamente (pero no por 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.
3) Constructor de movimiento: Si
other contiene un valor, inicializa el valor contenido como si se inicializara directamente (pero no por inicialización directa de lista) un objeto de tipo T con la expresión std::move(*other) y no hace a other vacío: un {{tt|optional} que ha sido movido aún contiene un valor, pero el valor mismo se ha movido. Si other no contiene un valor, construye un objeto que no contiene un valor.
- Este constructor no participa en la resolución de sobrecargas a menos que
std::is_move_constructible_v<T>estrue. - Es un constructor trivial si
std::is_trivially_move_constructible_v<T>estrue.
4) Constructor de copia de conversión: Si
other no contiene un valor, construye un objeto optional que no contiene un valor. De lo contrario, construye un objeto optional que contiene un valor, inicializado como si se inicializara directamente (pero no por inicialización directa de lista) un objeto de tipo T con la expresión *other.
- Este constructor no participa en la resolución de sobrecargas a menos que se cumplan las siguientes condiciones:
std::is_constructible_v<T, const U&>estrue.Tno es construible o es convertible desde cualquier expresión de tipo (posiblementeconst)std::optional<U>, es decir, los siguientes 8 rasgos de tipo son todosfalse:std::is_constructible_v<T, std::optional<U>&>std::is_constructible_v<T, const std::optional<U>&>std::is_constructible_v<T, std::optional<U>&&>std::is_constructible_v<T, const std::optional<U>&&>std::is_convertible_v<std::optional<U>&, T>std::is_convertible_v<const std::optional<U>&, T>std::is_convertible_v<std::optional<U>&&, T>std::is_convertible_v<const std::optional<U>&&, T>
- Este constructor es
explicitsi y solo sistd::is_convertible_v<const U&, T>esfalse.
5) Constructor de movimiento de conversión: Si
other no contiene un valor, construye un objeto optional que no contiene un valor. De lo contrario, construye un objeto optional que contiene un valor, inicializado como si se inicializara directamente (pero no por 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 sobrecargas a menos que se cumplan las siguientes condiciones:
std::is_constructible_v<T, U&&>estrue.Tno es construible o es convertible desde cualquier expresión de tipo (posiblementeconst)std::optional<U>, es decir, los siguientes 8 rasgos de tipo son todosfalse:std::is_constructible_v<T, std::optional<U>&>std::is_constructible_v<T, const std::optional<U>&>std::is_constructible_v<T, std::optional<U>&&>std::is_constructible_v<T, const std::optional<U>&&>std::is_convertible_v<std::optional<U>&, T>std::is_convertible_v<const std::optional<U>&, T>std::is_convertible_v<std::optional<U>&&, T>std::is_convertible_v<const std::optional<U>&&, T>
- Este constructor es
explicitsi y solo sistd::is_convertible_v<U&&, T>esfalse.
6) Construye un objeto
optional que contiene un valor, inicializado como si se inicializara directamente (pero no por inicialización directa de lista) un objeto de tipo T de los argumentos std::forward<Args>(args)....
- Si el constructor seleccionado de
Tes un constructorconstexpr, este constructor es un constructorconstexpr. - Esta función no participa en la resolución de sobrecargas a menos que
std::is_constructible_v<T, Args...>seatrue.
7) Construye un objeto
optional que contiene un valor, inicializado como si se inicializara directamente (pero no por inicialización directa de lista) un objeto de tipo T de los argumentos ilist, std::forward<Args>(args)....
- Si el constructor seleccionado de
Tes unconstexprconstructor, este constructor es un constructorconstexpr. - Esta función no participa en la resolución de sobrecargas a menos que
std::is_constructible_v<T, std::initializer_list<U>&, Args&&...>seatrue.
8) Construye un objeto
optional que contiene un valor, inicializado como si se inicializara directamente (pero no por inicialización directa de lista) un objeto de tipo T (where T = value_type) 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 sobrecargas a menos que
std::is_constructible_v<T, U&&>seatrueystd::decay_t<U>(hasta C++20)std::remove_cvref_t<U>(desde C++20) no sea ni std::in_place_t nistd::optional<T>. - Este constructor es
explicitsi y solo sistd::is_convertible_v<U&&, T>esfalse.
Parámetros
| other | - | Otro objeto optional cuyo valor contenido se copia.
|
| value | - | Valor con el cual inicializar el valor contenido. |
| args... | - | Argumentos con los cuales inicializar el valor contenido. |
| ilist | - | Lista de inicializadores con la cual inicializar el valor contenido. |
Excepciones
2) Lanza cualquier excepción lanzada por el constructor de
T.3) Lanza cualquier excepción lanzada por el constructor de
T. Tiene la siguiente Especificación noexcept: (desde C++11)
.<tbody>
</tbody>
noexcept(std::is_nothrow_move_constructible<T>::value) |
||
4-8) Lanza cualquier excepción lanzada por el constructor de
T.Guías de deducción
Ejemplo
Ejecuta este código
#include <optional>
#include <iostream>
#include <string>
int main()
{
std::optional<int> o1, // vacío
o2 = 1, // inicializar desde rvalue
o3 = o2; // constructor de copia
// llama al constructor de std::string( initializer_list<CharT> )
std::optional<std::string> o4(std::in_place, {'a', 'b', 'c'});
// llama al constructor de std::string( size_type count, CharT ch )
std::optional<std::string> o5(std::in_place, 3, 'A');
// construido por movimiento de std::string usando la guía de deducción para escoger el tipo
std::optional o6(std::string{"deducción"});
std::cout << *o2 << ' ' << *o3 << ' ' << *o4 << ' ' << *o5 << ' ' << *o6 << '\n';
}
Salida:
1 1 abc AAA deducción
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 |
|---|---|---|---|
| P0602R4 | C++17 | Los constructores de copia/movimiento pueden no ser triviales incluso si el constructor subyacente es trivial. | Se requirió que propagase la trivialidad. |
Véase también
(C++17) |
Crea un objeto opcional (optional). (plantilla de función) |