Namespaces
Variants

std::optional<T>:: operator->, std::optional<T>:: operator*

From cppreference.net
Utilities library
constexpr const T * operator - > ( ) const noexcept ;
(1) (desde C++17)
constexpr T * operator - > ( ) noexcept ;
(2) (desde C++17)
constexpr const T & operator * ( ) const & noexcept ;
(3) (desde C++17)
constexpr T & operator * ( ) & noexcept ;
(4) (desde C++17)
constexpr const T && operator * ( ) const && noexcept ;
(5) (desde C++17)
constexpr T && operator * ( ) && noexcept ;
(6) (desde C++17)

Accede al valor contenido.

1,2) Devuelve un puntero al valor contenido.
3-6) Devuelve una referencia al valor contenido.

Si has_value() es false , el comportamiento es indefinido.

(hasta C++26)

Si has_value() es false :

  • Si la implementación está protegida , ocurre una violación de contrato . Además, si el manejador de violación de contrato retorna bajo semántica de evaluación "observar", el comportamiento es indefinido.
  • Si la implementación no está protegida, el comportamiento es indefinido.
(desde C++26)

Contenidos

Valor de retorno

1,2) val
3,4) * val
5,6) std :: move ( * val  )

Notas

Este operador no verifica si * this contiene un valor, los usuarios pueden hacerlo manualmente usando has_value() o operator bool() . Alternativamente, si se necesita acceso verificado, value() o value_or() pueden usarse.

Ejemplo

#include <iomanip>
#include <iostream>
#include <optional>
#include <string>
int main()
{
    using namespace std::string_literals;
    std::optional<int> opt1{1};
    std::cout << "opt1: " << *opt1 << '\n';
    *opt1 = 2;
    std::cout << "opt1: " << *opt1 << '\n';
    std::optional<std::string> opt2{"abc"s};
    std::cout << "opt2: " << std::quoted(*opt2) << ", size: " << opt2->size() << '\n';
    // Puedes "tomar" el valor contenido llamando a operator* en un rvalue de optional
    auto taken = *std::move(opt2);
    std::cout << "taken: " << std::quoted(taken) << "\n"
                 "opt2: " << std::quoted(*opt2) << ", size: " << opt2->size() << '\n';
}

Salida:

opt1: 1
opt1: 2
opt2: "abc", size: 3
taken: "abc"
opt2: "", size: 0

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 2762 C++17 operator-> y operator* podrían ser potencialmente lanzadores de excepciones convertidos en noexcept

Véase también

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)