Namespaces
Variants

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

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

Accède à la valeur contenue.

1,2) Retourne un pointeur vers la valeur contenue.
3-6) Retourne une référence à la valeur contenue.

Si has_value() est false , le comportement est indéfini.

(jusqu'à C++26)

Si has_value() est false :

  • Si l'implémentation est durcie , une violation de contrat se produit. De plus, si le gestionnaire de violation de contrat retourne sous la sémantique d'évaluation "observer", le comportement est indéfini.
  • Si l'implémentation n'est pas durcie, le comportement est indéfini.
(depuis C++26)

Table des matières

Valeur de retour

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

Notes

Cet opérateur ne vérifie pas si * this contient une valeur, les utilisateurs peuvent le faire manuellement en utilisant has_value() ou operator bool() . Alternativement, si un accès vérifié est nécessaire, value() ou value_or() peuvent être utilisés.

Exemple

#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';
    // Vous pouvez « prendre » la valeur contenue en appelant operator* sur un rvalue vers optional
    auto taken = *std::move(opt2);
    std::cout << "taken: " << std::quoted(taken) << "\n"
                 "opt2: " << std::quoted(*opt2) << ", size: " << opt2->size() << '\n';
}

Sortie :

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

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
LWG 2762 C++17 operator-> et operator* pouvaient potentiellement lever des exceptions rendus noexcept

Voir aussi

renvoie la valeur contenue
(fonction membre publique)
renvoie la valeur contenue si disponible, une autre valeur sinon
(fonction membre publique)