std::optional
| Definido en el encabezado <optional>
|
||
template< class T >
class optional;
|
(desde C++17) | |
La plantilla de clase std::optional gestiona un valor contenido opcional, es decir, un valor que puede o no estar presente.
Un caso de uso común para optional es el valor de retorno de una función que puede fallar. En comparación con otros enfoques, como std::pair<T, bool>, optional maneja bien objetos costosos de construir y es más legible, ya que la intención se expresa explícitamente.
Cualquier instancia de optional en cualquier momento dado contiene un valor o no contiene un valor.
Si un optional contiene un valor, se garantiza que el valor está anidado dentro del objeto optional. Por lo tanto, un objeto optional modela un objeto, no un puntero, aunque operator*() y operator->() estén definidos.
Cuando un objeto de tipo optional<T> es convertido contextualmente a bool, la conversión devuelve true si el objeto contiene un valor y false si no contiene un valor.
El objeto optional contiene un valor en las siguientes condiciones:
- El objeto se inicializa/asigna con un valor de tipo
Tu otrooptionalque contiene un valor.
El objeto no contiene un valor en las siguientes condiciones:
- El objeto se inicializa por defecto.
- El objeto se inicializa/asigna con un valor de tipo std::nullopt_t o un objeto
optionalque no contiene un valor. - Se llama a la función miembro reset().
|
El objeto |
(desde C++26) |
No existen referencias, funciones, arreglos o (posiblemente cv-cualificados) void opcionales; un programa está mal formado si se instancia un optional con dicho tipo. Además, un programa está mal formado si se instancia un optional con los tipos de etiqueta (posiblemente cv-cualificados) std::nullopt_t o std::in_place_t.
Parámetros de plantilla
| T | - | el tipo del valor para gestionar el estado de inicialización. El tipo debe cumplir con los requisitos de Destructible (en particular, los tipos array y referencia no están permitidos). |
Tipos anidados
| Tipo | Definición |
value_type
|
T
|
iterator
(desde C++26)
|
definido por la implementación
LegacyRandomAccessIterator
,
ConstexprIterator
, y
contiguous_iterator
cuyo
value_type
y
reference
son
std::
remove_cv_t
<
T
>
y
T
&
, respectivamente.
|
const_iterator
(desde C++26)
|
definido por la implementación
LegacyRandomAccessIterator
,
ConstexprIterator
, y
contiguous_iterator
cuyo
value_type
y
reference
son
std::
remove_cv_t
<
T
>
y
const
T
&
, respectivamente.
|
Todos los requisitos sobre los tipos de iterador de un
Container
se aplican también al tipo
iterator
de
optional
.
Miembros de datos
T*
val
|
un puntero al objeto contenido (si existe)
( objeto miembro solo para exposición* ) |
Funciones miembro
construye el objeto
optional
(función miembro pública) |
|
|
destruye el valor contenido, si existe
(función miembro pública) |
|
|
asigna contenidos
(función miembro pública) |
|
Iteradores |
|
|
(C++26)
|
devuelve un iterador al inicio
(función miembro pública) |
|
(C++26)
|
devuelve un iterador al final
(función miembro pública) |
Observadores |
|
|
accede al valor contenido
(función miembro pública) |
|
|
comprueba si el objeto contiene un valor
(función miembro pública) |
|
|
devuelve el valor contenido
(función miembro pública) |
|
|
devuelve el valor contenido si está disponible, otro valor en caso contrario
(función miembro pública) |
|
Operaciones monádicas |
|
|
(C++23)
|
devuelve el resultado de la función dada sobre el valor contenido si existe, o un
optional
vacío en caso contrario
(función miembro pública) |
|
(C++23)
|
devuelve un
optional
que contiene el valor contenido transformado si existe, o un
optional
vacío en caso contrario
(función miembro pública) |
|
(C++23)
|
devuelve el propio
optional
si contiene un valor, o el resultado de la función dada en caso contrario
(función miembro pública) |
Modificadores |
|
|
intercambia los contenidos
(función miembro pública) |
|
|
destruye cualquier valor contenido
(función miembro pública) |
|
|
construye el valor contenido in situ
(función miembro pública) |
|
Funciones no miembro
|
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++20)
|
compara objetos
optional
(plantilla de función) |
|
(C++17)
|
crea un objeto
optional
(plantilla de función) |
|
(C++17)
|
especializa el algoritmo
std::swap
(plantilla de función) |
Clases auxiliares
|
(C++17)
|
soporte de hash para
std::optional
(especialización de plantilla de clase) |
|
(C++17)
|
indicador de un
std::optional
que no contiene un valor
(clase) |
|
(C++17)
|
excepción que indica acceso verificado a un optional que no contiene un valor
(clase) |
Asistentes
|
(C++17)
|
un objeto de tipo
nullopt_t
(constante) |
|
etiqueta de construcción in situ
(etiqueta) |
Especializaciones auxiliares
|
template
<
class
T
>
constexpr bool ranges:: enable_view < std :: optional < T >> = true ; |
(desde C++26) | |
Esta especialización de
ranges::enable_view
hace que
optional
satisfaga
view
.
|
template
<
class
T
>
constexpr auto format_kind < std :: optional < T >> = range_format :: disabled ; |
(desde C++26) | |
Esta especialización de
format_kind
desactiva el
soporte de formato de rangos
de
optional
.
Guías de deducción
Notas
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_optional
|
201606L
|
(C++17) |
std::optional
|
202106L
|
(C++23)
(DR20) |
Completamente constexpr | |
202110L
|
(C++23) | Operaciones mónadas | |
__cpp_lib_optional_range_support
|
202406L
|
(C++26) |
Soporte de rangos para
std::optional
|
Ejemplo
#include <iostream> #include <optional> #include <string> // optional puede usarse como tipo de retorno de una fábrica que puede fallar std::optional<std::string> create(bool b) { if (b) return "Godzilla"; return {}; } // std::nullopt puede usarse para crear cualquier std::optional (vacío) auto create2(bool b) { return b ? std::optional<std::string>{"Godzilla"} : std::nullopt; } int main() { std::cout << "create(false) returned " << create(false).value_or("empty") << '\n'; // las funciones fábrica que retornan optional son utilizables como condiciones de while e if if (auto str = create2(true)) std::cout << "create2(true) returned " << *str << '\n'; }
Salida:
create(false) returned empty create2(true) returned Godzilla
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 4141 | C++17 |
el requisito de asignación de almacenamiento
era confuso |
el objeto contenido debe estar
anidado dentro del objeto
optional
|
Véase también
|
(C++17)
|
una unión discriminada type-safe
(plantilla de clase) |
|
(C++17)
|
objetos que contienen instancias de cualquier tipo
CopyConstructible
(clase) |
|
(C++23)
|
un wrapper que contiene un valor esperado o un error
(plantilla de clase) |
un
view
que contiene un único elemento de un valor especificado
(plantilla de clase) (objeto de punto de personalización) |
|
|
(C++20)
|
un
view
vacío sin elementos
(plantilla de clase) (plantilla de variable) |