Namespaces
Variants

std::optional<T>::swap

Depuis fr.cppreference.net
 
 
Bibliothèque des utilitaires
Support du langage
Support des types (types de base, RTTI)
Macros de test de fonctionnalités de la bibliothèque (C++20)
Utilitaires de programme
Fonctions variadiques
Support des coroutines (C++20)
Support des contrats (C++26)
Comparaison à trois voies
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilitaires généraux
Opérateurs relationnels (obsolète en C++20)
 
 
void swap( optional& other ) noexcept(/* see below */);
(depuis C++17)
(constexpr depuis C++20)

Échange le contenu avec celui de other.

  • Si ni *this ni other ne contiennent de valeur, la fonction n'a aucun effet.
  • Si un seul de *this et other contient une valeur (appelons cet objet in et l'autre un), la valeur contenue de un est directement initialisée à partir de std::move(*in), suivie de la destruction de la valeur contenue de in comme par in->T::~T(). Après cet appel, in ne contient pas de valeur ; un contient une valeur.
  • Si *this et other contiennent tous deux des valeurs, les valeurs contenues sont échangées en appelant using std::swap; swap(**this, *other).

Le programme est mal formé sauf si le type T est Échangeable et que std::is_move_constructible_v<T> est true.

Paramètres

autre - l'objet optional avec lequel échanger le contenu

Valeur de retour

(aucun)

Exceptions

En cas d'exception levée, les états des valeurs contenues de * this et other sont déterminés par les garanties de sûreté d'exception du swap du type T ou du constructeur de déplacement de T , selon celui qui est appelé. Pour * this et other , si l'objet contenait une valeur, il reste contenant une valeur, et vice versa.

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_optional 202106L (C++20)
(DR20)
Complètement constexpr

Remarques

Macro de test de fonctionnalité Valeur Norme Fonctionnalité
__cpp_lib_optional 202106L (C++20)
(DR20)
Complètementconstexpr

Exemple

#include <iostream>
#include <optional>
#include <string>
int main()
{
    std::optional<std::string> opt1("First example text");
    std::optional<std::string> opt2("2nd text");
    enum Swap { Before, After };
    auto print_opts = [&](Swap e)
    {
        std::cout << (e == Before ? "Before swap:\n" : "After swap:\n");
        std::cout << "opt1 contains '" << opt1.value_or("") << "'\n";
        std::cout << "opt2 contains '" << opt2.value_or("") << "'\n";
        std::cout << (e == Before ? "---SWAP---\n": "\n");
    };
    print_opts(Before);
    opt1.swap(opt2);
    print_opts(After);
    // Swap with only 1 set
    opt1 = "Lorem ipsum dolor sit amet, consectetur tincidunt.";
    opt2.reset();
    print_opts(Before);
    opt1.swap(opt2);
    print_opts(After);
}

Sortie :

Before swap:
opt1 contains 'First example text'
opt2 contains '2nd text'
---SWAP---
After swap:
opt1 contains '2nd text'
opt2 contains 'First example text'
Before swap:
opt1 contains 'Lorem ipsum dolor sit amet, consectetur tincidunt.'
opt2 contains ''
---SWAP---
After swap:
opt1 contains ''
opt2 contains 'Lorem ipsum dolor sit amet, consectetur tincidunt.'

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 S'applique à Comportement publié Comportement corrigé
P2231R1 C++20 swap n'était pas constexpr alors que les opérations requises pouvaient être constexpr en C++20 rendu constexpr

Voir aussi

spécialise l'algorithme std::swap
(modèle de fonction)