operator==, !=, <, <=, >, >=, <=> (std::variant)
|
Défini dans l'en-tête
<variant>
|
||
|
template
<
class
...
Types
>
constexpr
bool
operator
==
(
const
std::
variant
<
Types...
>
&
lhs,
|
(1) | (depuis C++17) |
|
template
<
class
...
Types
>
constexpr
bool
operator
!
=
(
const
std::
variant
<
Types...
>
&
lhs,
|
(2) | (depuis C++17) |
|
template
<
class
...
Types
>
constexpr
bool
operator
<
(
const
std::
variant
<
Types...
>
&
lhs,
|
(3) | (depuis C++17) |
|
template
<
class
...
Types
>
constexpr
bool
operator
>
(
const
std::
variant
<
Types...
>
&
lhs,
|
(4) | (depuis C++17) |
|
template
<
class
...
Types
>
constexpr
bool
operator
<=
(
const
std::
variant
<
Types...
>
&
lhs,
|
(5) | (depuis C++17) |
|
template
<
class
...
Types
>
constexpr
bool
operator
>=
(
const
std::
variant
<
Types...
>
&
lhs,
|
(6) | (depuis C++17) |
|
template
<
class
...
Types
>
constexpr
std::
common_comparison_category_t
|
(7) | (depuis C++20) |
|
Modèle de fonction d'assistance
|
||
|
template
<
std::
size_t
I,
class
...
Types
>
constexpr
const
std::
variant_alternative_t
<
I,
std::
variant
<
Types...
>>
&
|
(8) | ( exposition uniquement* ) |
Effectue des opérations de comparaison sur les objets std::variant .
T
) uniquement si
lhs
et
rhs
contiennent des valeurs correspondant au même index. Sinon,
- lhs est considéré égal à rhs si, et seulement si, ni lhs ni rhs ne contiennent de valeur.
- lhs est considéré inférieur à rhs si, et seulement si, soit rhs contient une valeur et lhs n'en contient pas, soit lhs. index ( ) est inférieur à rhs. index ( ) .
|
Si, pour certaines valeurs de
I
, l'expression correspondante
|
(jusqu'à C++26) |
|
Cette surcharge participe à la résolution de surcharge seulement si pour toutes les valeurs de
I
, l'expression correspondante
|
(depuis C++26) |
GET
se comporte comme
std::get
(std::variant)
, sauf que
std::bad_variant_access
n'est jamais levée.
Table des matières |
Paramètres
| lhs,rhs | - | variantes à comparer |
Valeur de retour
| 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 <=> :
- Si seulement lhs est sans valeur, retourne std::strong_ordering::less .
- Si seulement rhs est sans valeur, retourne std::strong_ordering::greater .
- Si lhs et rhs sont tous deux sans valeur, retourne std::strong_ordering::equal .
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) |