Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::three_way_comparable,std::three_way_comparable_with

      From cppreference.com
      <cpp‎ |utility
       
       
      Utilities library
       
      Defined in header<compare>
      template<class T,class Cat=std::partial_ordering>

      concept three_way_comparable=
          __WeaklyEqualityComparableWith<T, T>&&
          __PartiallyOrderedWith<T, T>&&
          requires(conststd::remove_reference_t<T>& a,
                   conststd::remove_reference_t<T>& b){
             { a<=> b}-> __ComparesAs<Cat>;

         };
      (1)(since C++20)
      template<class T,class U,class Cat=std::partial_ordering>

      concept three_way_comparable_with=
          std::three_way_comparable<T, Cat>&&
          std::three_way_comparable<U, Cat>&&
          __ComparisonCommonTypeWith<T, U>&&
          std::three_way_comparable<
             std::common_reference_t<
                 conststd::remove_reference_t<T>&,
                 conststd::remove_reference_t<U>&>, Cat>&&
          __WeaklyEqualityComparableWith<T, U>&&
          __PartiallyOrderedWith<T, U>&&
          requires(conststd::remove_reference_t<T>& t,
                   conststd::remove_reference_t<U>& u){
             { t<=> u}-> __ComparesAs<Cat>;
             { u<=> t}-> __ComparesAs<Cat>;

         };
      (2)(since C++20)
      template<class T,class Cat>

      concept __ComparesAs=

         std::same_as<std::common_comparison_category_t<T, Cat>, Cat>;
      (3)(exposition only*)
      1) The conceptstd::three_way_comparable specifies that the three way comparison operator<=> onT yield results consistent with the comparison category implied byCat.
      2) The conceptstd::three_way_comparable_with specifies that the three way comparison operator<=> on (possibly mixed)T andU operands yield results consistent with the comparison category implied byCat. Comparing mixed operands yields results equivalent to comparing the operands converted to their common type.

      __WeaklyEqualityComparableWith,__PartiallyOrderedWith, and__ComparisonCommonTypeWith are exposition-only concepts. See descriptions ofequality_comparable andtotally_ordered.

      Contents

      [edit]Semantic requirements

      These concepts are modeled only if they are satisfied and all concepts they subsume are modeled.

      1)T andCat modelstd::three_way_comparable<T, Cat> only if, given lvaluesa andb of typeconststd::remove_reference_t<T>, following are true:
      • (a<=> b==0)==bool(a== b),
      • (a<=> b!=0)==bool(a!= b),
      • ((a<=> b)<=>0) and(0<=>(b<=> a)) are equal,
      • bool(a> b)==bool(b< a),
      • bool(a>= b)==!bool(a< b),
      • bool(a<= b)==!bool(b< a),
      • (a<=> b<0)==bool(a< b),
      • (a<=> b>0)==bool(a> b),
      • (a<=> b<=0)==bool(a<= b), and
      • (a<=> b>=0)==bool(a>= b), and
      • ifCat is convertible tostd::strong_ordering,T modelstotally_ordered.
      2)T,U, andCat modelstd::three_way_comparable_with<T, U, Cat> only if given

      LetC bestd::common_reference_t<conststd::remove_reference_t<T>&,conststd::remove_reference_t<U>&> and given an expressionE and a typeC, letCONVERT_TO<C>(E) be:

      (until C++23)
      • static_cast<const C&>(std::as_const(E)) if that is a valid expression,
      • static_cast<const C&>(std::move(E)) otherwise.
      (since C++23)

      the following are true:

      • t<=> u andu<=> t have the same domain,
      • ((t<=> u)<=>0) and(0<=>(u<=> t)) are equal,
      • (t<=> u==0)==bool(t== u),
      • (t<=> u!=0)==bool(t!= u),
      • Cat(t<=> u)== Cat(CONVERT_TO<C>(t2)<=> CONVERT_TO<C>(u2)),
      • (t<=> u<0)==bool(t< u),
      • (t<=> u>0)==bool(t> u),
      • (t<=> u<=0)==bool(t<= u),
      • (t<=> u>=0)==bool(t>= u), and
      • ifCat is convertible tostd::strong_ordering,T andU modelstd::totally_ordered_with<T, U>.

      [edit]Equality preservation

      Expressions declared inrequires expressions of the standard library concepts are required to beequality-preserving (except where stated otherwise).

      [edit]Implicit expression variations

      Arequires expression that uses an expression that is non-modifying for some constant lvalue operand also requiresimplicit expression variations.

      [edit]See also

      specifies that operator== is an equivalence relation
      (concept)[edit]
      specifies that the comparison operators on the type yield a total order
      (concept)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/utility/compare/three_way_comparable&oldid=158782"

      [8]ページ先頭

      ©2009-2025 Movatter.jp