Espacios de nombres
Variantes
Acciones

std::optional

De cppreference.com
< cpp‎ | utility
 
 
 
 
Definido en el archivo de encabezado <optional>
template< typename T >
class optional;
(desde C++17)

La plantilla de clase std::optional administra un valor contenido opcional, p.ej., 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. A diferencia de otros enfoques, como std::pair<T,bool>, optional maneja bien los objetos costosos de construir y es más legible, ya que la intención se expresa explícitamente .

Cualquier instancia de optional<T> en cualquier momento dado, contiene un valor o no contiene un valor.

Si un optional<T> contiene un valor, se garantiza que el valor se asignará como parte del espacio ocupado del objeto optional, es decir, nunca se realiza una asignación de memoria dinámica. 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 contextualmente convertido 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 con, o es asignado desde un valor de tipo T u otro optional que contiene un valor.

El objeto optional no contiene un valor en las siguientes condiciones:

  • El objeto está inicializado por defecto.
  • El objeto se inicializa con/es asignado a partir de un valor de tipo std::nullopt_t o un objeto optional que no contiene un valor.
  • Se llama a la función miembro reset().

No hay referencias opcionales; un programa está mal formado si crea una instancia de optional con un tipo de referencia. Alternativamente, un optional de un std::reference_wrapper del tipo T puede usarse para contener una referencia. Además, un programa está mal formado si crea una instancia de optional con los tipos de etiqueta (posiblemente calificados-cv) std::nullopt_t o std::in_place_t.

Contenido

[editar] Parámetros de plantilla

T - El tipo del valor para el cual manejar el estado de inicialización. el tipo debe satisfacer los requerimientos de Destructible (en particular, no se permiten los tipos de array).

[editar] Tipos miembro

Tipo miembro Definición
value_type T

[editar] Funciones miembro

Construye el objeto opcional.
(función miembro pública) [editar]
Destruye el valor contenido, si es que lo hay.
(función miembro pública) [editar]
Asigna contenido.
(función miembro pública) [editar]
Observadores
Accede al valor contenido.
(función miembro pública) [editar]
Comprueba si un objeto opcional contiene un valor.
(función miembro pública) [editar]
Devuelve el valor contenido.
(función miembro pública) [editar]
Devuelve el valor contenido si está disponible, de otra manera, otro valor.
(función miembro pública) [editar]
Modificadores
Intercambia los contenidos.
(función miembro pública) [editar]
Destruye cualquier valor contenido.
(función miembro pública) [editar]
Construye el valor contenido en el sitio.
(función miembro pública) [editar]

[editar] Funciones no miembro

(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20)
Compara objetos opcionales (optional).
(plantilla de función) [editar]
Crea un objeto opcional (optional).
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(función) [editar]

[editar] Clases asistentes

Especializa el algoritmo std::hash.
(especialización de plantilla de clase) [editar]
(C++17)
Indicador de un tipo opcional con estado no inicializado.
(clase) [editar]
Excepción que indica que la prueba de acceso de un opcional no contiene un valor.
(clase) [editar]

[editar] Asistentes

(C++17)
Un objeto de tipo nullopt_t
(constante) [editar]
Etiqueta de construccón en el sitio (in situ).
(plantilla de clase) [editar]

[editar] Guías de deducción

[editar] Ejemplo

#include <string>
#include <functional>
#include <iostream>
#include <optional>
 
// optional puede usarse como el tipo de retorno de una fábrica que puede fallar
std::optional<std::string> crear(bool b) {
    if (b)
        return "Godzilla";
    return {};
}
 
// std::nullopt puede usarse para crear cuqlier std::optional (vacío)
auto crear2(bool b) {
    return b ? std::optional<std::string>{"Godzilla"} : std::nullopt;
}
 
// std::reference_wrapper puede usarse para devolver una referencia
auto crear_ref(bool b) {
    static std::string value = "Godzilla";
    return b ? std::optional<std::reference_wrapper<std::string>>{value}
             : std::nullopt;
}
 
int main()
{
    std::cout << "crear(false) ha devuelto "
              << crear(false).value_or("vacio") << '\n';
 
    // funciones fábrica que devuelven un opcional son utilizables como condiciones
    // para las instrucciones while e if
    if (auto str = crear2(true)) {
        std::cout << "crear2(true) ha devuelto " << *str << '\n';
    }
 
    if (auto str = crear_ref(true)) {
        // usar get() para acceder al valor de reference_wrapper
        std::cout << "crear_ref(true) ha devuelto " << str->get() << '\n';
        str->get() = "Mothra";
        std::cout << "al modificarlo ha cambiado a " << str->get() << '\n';
    }
}

Salida:

crear(false) ha devuelto vacio
crear2(true) ha devuelto Godzilla
crear_ref(true) ha devuelto Godzilla
al modificarlo ha cambiado a Mothra

[editar] Véase también

(C++17)
Una unión discriminada con seguridad de tipo.
(plantilla de clase) [editar]
(C++17)
Objetos que contienen instancias de cualquier tipo CopyConstructible.
(clase) [editar]