|
|
Member functions | ||||
Observers | ||||
Modifiers | ||||
Visitation | ||||
(C++26) | ||||
Non-member functions | ||||
operator==operator!=operator<operator<=operator>operator>=operator<=> (C++20) | ||||
Helper classes | ||||
Helper objects | ||||
Defined in header <variant> | ||
template<class...Types> constexprbool operator==(conststd::variant<Types...>& lhs, | (1) | (since C++17) |
template<class...Types> constexprbool operator!=(conststd::variant<Types...>& lhs, | (2) | (since C++17) |
template<class...Types> constexprbool operator<(conststd::variant<Types...>& lhs, | (3) | (since C++17) |
template<class...Types> constexprbool operator>(conststd::variant<Types...>& lhs, | (4) | (since C++17) |
template<class...Types> constexprbool operator<=(conststd::variant<Types...>& lhs, | (5) | (since C++17) |
template<class...Types> constexprbool operator>=(conststd::variant<Types...>& lhs, | (6) | (since C++17) |
template<class...Types> constexprstd::common_comparison_category_t | (7) | (since C++20) |
Helper function template | ||
template<std::size_t I,class...Types> constexprconststd::variant_alternative_t<I,std::variant<Types...>>& | (8) | (exposition only*) |
Performs comparison operations onstd::variant objects.
T
) only if bothlhs andrhs contain values corresponding to the same index. Otherwise,If, for some values ofI, the corresponding expression | (until C++26) |
This overload participates in overload resolution only if for all values ofI, the corresponding expression | (since C++26) |
GET
behaves likestd::get(std::variant)
, except thatstd::bad_variant_access is never thrown.Contents |
lhs,rhs | - | variants to compare |
Operator | Both operands contains a value (letI belhs.index() andJ berhs.index()) | lhs orrhs is valueless (letlhs_empty belhs.valueless_by_exception() andrhs_empty berhs.valueless_by_exception()) | |
---|---|---|---|
I andJ are equal | I andJ are unequal | ||
== | 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() | see below |
Foroperator<=>:
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_constrained_equality | 202403L | (C++26) | constrained comparison operators forstd::variant |
#include <iostream>#include <string>#include <variant> int main(){std::cout<<std::boolalpha;std::string cmp;bool result; auto print2=[&cmp,&result](constauto& lhs,constauto& rhs){std::cout<< lhs<<' '<< cmp<<' '<< rhs<<" : "<< result<<'\n';}; std::variant<int,std::string> v1, v2; std::cout<<"operator==\n";{ cmp="=="; // by default v1 = 0, v2 = 0; result= v1== v2;// truestd::visit(print2, v1, v2); v1= v2=1; result= v1== v2;// truestd::visit(print2, v1, v2); v2=2; result= v1== v2;// falsestd::visit(print2, v1, v2); v1="A"; result= v1== v2;// false: v1.index == 1, v2.index == 0std::visit(print2, v1, v2); v2="B"; result= v1== v2;// falsestd::visit(print2, v1, v2); v2="A"; result= v1== v2;// truestd::visit(print2, v1, v2);} std::cout<<"operator<\n";{ cmp="<"; v1= v2=1; result= v1< v2;// falsestd::visit(print2, v1, v2); v2=2; result= v1< v2;// truestd::visit(print2, v1, v2); v1=3; result= v1< v2;// falsestd::visit(print2, v1, v2); v1="A"; v2=1; result= v1< v2;// false: v1.index == 1, v2.index == 0std::visit(print2, v1, v2); v1=1; v2="A"; result= v1< v2;// true: v1.index == 0, v2.index == 1std::visit(print2, v1, v2); v1= v2="A"; result= v1< v2;// falsestd::visit(print2, v1, v2); v2="B"; result= v1< v2;// truestd::visit(print2, v1, v2); v1="C"; result= v1< v2;// falsestd::visit(print2, v1, v2);} {std::variant<int,std::string> v1;std::variant<std::string,int> v2;// v1 == v2; // Compilation error: no known conversion} // TODO: C++20 three-way comparison operator <=> for variants}
Output:
operator==0 == 0 : true1 == 1 : true1 == 2 : falseA == 2 : falseA == B : falseA == A : trueoperator<1 < 1 : false1 < 2 : true3 < 2 : falseA < 1 : false1 < A : trueA < A : falseA < B : trueC < B : false
(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20) | comparesoptional objects(function template)[edit] |