Namespaces
Variants

operator==, !=, <, <=, >, >=, <=>(std::variant)

Depuis fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support linguistique
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)
 
 
Défini dans l'en-tête <variant>
template< class... Types >
constexpr bool operator==( const std::variant<Types...>& lhs,
                           const std::variant<Types...>& rhs );
(1) (depuis C++17)
template< class... Types >
constexpr bool operator!=( const std::variant<Types...>& lhs,
                           const std::variant<Types...>& rhs );
(2) (depuis C++17)
template< class... Types >
constexpr bool operator<( const std::variant<Types...>& lhs,
                          const std::variant<Types...>& rhs );
(3) (depuis C++17)
template< class... Types >
constexpr bool operator>( const std::variant<Types...>& lhs,
                          const std::variant<Types...>& rhs );
(4) (depuis C++17)
template< class... Types >
constexpr bool operator<=( const std::variant<Types...>& lhs,
                           const std::variant<Types...>& rhs );
(5) (depuis C++17)
template< class... Types >
constexpr bool operator>=( const std::variant<Types...>& lhs,
                           const std::variant<Types...>& rhs );
(6) (depuis C++17)
template< class... Types >
constexpr std::common_comparison_category_t
              <std::compare_three_way_result_t<Types>...>
    operator<=>( const std::variant<Types...>& lhs,
                 const std::variant<Types...>& rhs );
(7) (depuis C++20)
Gabarit de fonction d'aide
template< std::size_t I, class... Types >
constexpr const std::variant_alternative_t<I, std::variant<Types...>>&
    GET( const variant<Types...>& v );
(8) (exposition uniquement*)

Effectue des opérations de comparaison sur des objets std::variant.

1-7) Compare deux objets std::variant lhs et rhs. Les valeurs contenues sont comparées (en utilisant l'opérateur correspondant de T) seulement si lhs et rhs contiennent tous deux des valeurs correspondant au même indice. Sinon,
  • lhs est considéré égal à rhs si, et seulement si, lhs et rhs ne contiennent tous deux aucune valeur.
  • lhs est considéré inférieur à rhs si, et seulement si, soit rhs contient une valeur et lhs non, soit lhs.index() est inférieur à rhs.index().
1-6) Soit @ désignant l'opérateur de comparaison correspondant, pour chacune de ces fonctions :

Si, pour certaines valeurs de I, l'expression correspondante GET <I>(lhs) @ GET <I>(rhs) est mal formée ou son résultat n'est pas convertible en bool, le programme est mal formé.

(jusqu'à C++26)

Cette surcharge participe à la résolution de surcharge seulement si, pour toutes les valeurs de I, l'expression correspondante GET <I>(lhs) @ GET <I>(rhs) est bien formée et son résultat est convertible en bool.

(depuis C++26)
8) Le gabarit de fonction d'exposition uniquement GET se comporte comme std::get(std::variant), sauf que std::bad_variant_access n'est jamais levée.
Si I < sizeof...(Types) est false, le programme est mal formé.
Si I == v.index() est false, le comportement est indéfini.

Paramètres

lhs,rhs - variantes à comparer

Valeur de retour

**Note:** Le code C++ et les termes techniques (`GET`, `lhs`, `rhs`, `lhs_empty`, `rhs_empty`, `false`) ont été conservés en anglais conformément aux instructions. Seul le contenu textuel non technique a été traduit, mais dans ce fragment spécifique, il n'y avait aucun texte non technique à traduire en dehors des balises de code C++.
Opérateur Les deux opérandes contiennent une valeur
(soit I = lhs. index ( ) et J = rhs. index ( ) )
lhs ou rhs est sans valeur
(soit lhs_empty = lhs. valueless_by_exception ( ) et rhs_empty = rhs. valueless_by_exception ( ) )
I et J sont égaux I et J sont différents
== GET  < I > ( lhs ) == GET  < I > ( rhs ) false lhs_empty && rhs_empty
! = GET  < I > ( lhs ) ! = GET  < I > ( rhs ) true lhs_empty ! = rhs_empty
< GET  < I > ( lhs ) < GET  < I > ( rhs ) lhs. index ( ) < rhs. index ( ) lhs_empty && ! rhs_empty
> GET  < I > ( lhs ) > GET  < I > ( rhs ) lhs. index ( ) > rhs. index ( ) ! lhs_empty && rhs_empty
<= GET  < I > ( lhs ) <= GET  < I > ( rhs ) lhs. index ( ) < rhs. index ( ) lhs_empty
>= GET  < I > ( lhs ) >= GET  < I > ( rhs ) lhs. index ( ) > rhs. index ( ) rhs_empty
<=> GET  < I > ( lhs ) <=> GET  < I > ( rhs ) lhs. index ( ) <=> rhs. index ( ) voir ci-dessous

Pour operator <=> :

Notes

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_constrained_equality 202403L (C++26) opérateurs de comparaison contraints pour std::variant

Exemple

#include <iostream>
#include <string>
#include <variant>
int main()
{
    std::cout << std::boolalpha;
    std::string cmp;
    bool result;
    auto print2 = [&cmp, &result](const auto& lhs, const auto& rhs)
    {
        std::cout << lhs << ' ' << cmp << ' ' << rhs << " : " << result << '\n';
    };
    std::variant<int, std::string> v1, v2;
    std::cout << "operator==\n";
    {
        cmp = "==";
        // par défaut v1 = 0, v2 = 0;
        result = v1 == v2; // true
        std::visit(print2, v1, v2);
        v1 = v2 = 1;
        result = v1 == v2; // true
        std::visit(print2, v1, v2);
        v2 = 2;
        result = v1 == v2; // false
        std::visit(print2, v1, v2);
        v1 = "A";
        result = v1 == v2; // false: v1.index == 1, v2.index == 0
        std::visit(print2, v1, v2);
        v2 = "B";
        result = v1 == v2; // false
        std::visit(print2, v1, v2);
        v2 = "A";
        result = v1 == v2; // true
        std::visit(print2, v1, v2);
    }
    std::cout << "operator<\n";
    {
        cmp = "<";
        v1 = v2 = 1;
        result = v1 < v2; // false
        std::visit(print2, v1, v2);
        v2 = 2;
        result = v1 < v2; // true
        std::visit(print2, v1, v2);
        v1 = 3;
        result = v1 < v2; // false
        std::visit(print2, v1, v2);
        v1 = "A"; v2 = 1;
        result = v1 < v2; // false: v1.index == 1, v2.index == 0
        std::visit(print2, v1, v2);
        v1 = 1; v2 = "A";
        result = v1 < v2; // true: v1.index == 0, v2.index == 1
        std::visit(print2, v1, v2);
        v1 = v2 = "A";
        result = v1 < v2; // false
        std::visit(print2, v1, v2);
        v2 = "B";
        result = v1 < v2; // true
        std::visit(print2, v1, v2);
        v1 = "C";
        result = v1 < v2; // false
        std::visit(print2, v1, v2);
    }
    {
        std::variant<int, std::string> v1;
        std::variant<std::string, int> v2;
    //  v1 == v2; // Erreur de compilation: aucune conversion connue
    }
    // TODO: C++20 opérateur de comparaison à trois voies <=> pour variants
}

Sortie :

operator==
0 == 0 : true
1 == 1 : true
1 == 2 : false
A == 2 : false
A == B : false
A == A : true
operator<
1 < 1 : false
1 < 2 : true
3 < 2 : false
A < 1 : false
1 < A : true
A < A : false
A < B : true
C < B : false

Voir aussi

(C++17) (C++17) (C++17) (C++17) (C++17) (C++17) (C++20)
compare les objets optional
(modèle de fonction)