Namespaces
Variants

std::optional<T>:: swap

From cppreference.net
Utilities library
void swap ( optional & other ) noexcept ( /* voir ci-dessous */ ) ;
(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 des deux * this et other contient une valeur (appelons cet objet in et l'autre un ), la valeur contenue de un est initialisée directement à 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 plus de valeur ; un contient une valeur.
  • Si les deux * this et other contiennent des valeurs, les valeurs contenues sont échangées en appelant using std:: swap ; swap ( ** this, * other ) .

Le programme est mal formé à moins que le type T ne soit Swappable et que std:: is_move_constructible_v < T > ne soit true .

Table des matières

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

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)