Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::strong_ordering

      From cppreference.com
      <cpp‎ |utility
       
       
      Utilities library
       
      Defined in header<compare>
      class strong_ordering;
      (since C++20)

      The class typestd::strong_ordering is the result type of athree-way comparison that:

      • Admits all six relational operators (==,!=,<,<=,>,>=).
      • Implies substitutability: ifa is equivalent tob,f(a) is also equivalent tof(b), wheref denotes a function that reads only comparison-salient state that is accessible via the argument's public const members. In other words, equivalent values are indistinguishable.
      • Does not allow incomparable values: exactly one ofa< b,a== b, ora> b must betrue.

      Contents

      [edit]Constants

      The typestd::strong_ordering has four valid values, implemented as const static data members of its type:

      Name Definition
      inlineconstexpr std::strong_ordering less
      [static]
      a valid value indicating less-than (ordered before) relationship
      (public static member constant)
      inlineconstexpr std::strong_ordering equivalent
      [static]
      a valid value indicating equivalence (neither ordered before nor ordered after), the same asequal
      (public static member constant)
      inlineconstexpr std::strong_ordering equal
      [static]
      a valid value indicating equivalence (neither ordered before nor ordered after), the same asequivalent
      (public static member constant)
      inlineconstexpr std::strong_ordering greater
      [static]
      a valid value indicating greater-than (ordered after) relationship
      (public static member constant)

      [edit]Conversions

      std::strong_ordering is the strongest of the three comparison categories: it is not implicitly-convertible from any other category and is implicitly-convertible to the other two.

      operator partial_ordering
      implicit conversion tostd::partial_ordering
      (public member function)

      std::strong_ordering::operator partial_ordering

      constexpr operator partial_ordering()constnoexcept;

      Return value

      std::partial_ordering::less ifv isless,std::partial_ordering::greater ifv isgreater,std::partial_ordering::equivalent ifv isequal orequivalent.

      operator weak_ordering
      implicit conversion tostd::weak_ordering
      (public member function)

      std::strong_ordering::operator weak_ordering

      constexpr operator weak_ordering()constnoexcept;

      Return value

      std::weak_ordering::less ifv isless,std::weak_ordering::greater ifv isgreater,std::weak_ordering::equivalent ifv isequal orequivalent.

      [edit]Comparisons

      Comparison operators are defined between values of this type and literal0. This supports the expressionsa<=> b==0 ora<=> b<0 that can be used to convert the result of a three-way comparison operator to a boolean relationship; seestd::is_eq,std::is_lt, etc.

      These functions are not visible to ordinaryunqualified orqualified lookup, and can only be found byargument-dependent lookup whenstd::strong_ordering is an associated class of the arguments.

      The behavior of a program that attempts to compare astrong_ordering with anything other than the integer literal0 is undefined.

      operator==operator<operator>operator<=operator>=operator<=>
      compares with zero or astrong_ordering
      (function)

      operator==

      friendconstexprbool
      operator==( strong_ordering v,/*unspecified*/ u)noexcept;
      (1)
      friendconstexprbool
      operator==( strong_ordering v, strong_ordering w)noexcept=default;
      (2)

      Parameters

      v, w -std::strong_ordering values to check
      u - an unused parameter of any type that accepts literal zero argument

      Return value

      1)true ifv isequivalent orequal,false ifv isless orgreater
      2)true if both parameters hold the same value,false otherwise. Note thatequal is the same asequivalent.

      operator<

      friendconstexprbool operator<( strong_ordering v,/*unspecified*/ u)noexcept;
      (1)
      friendconstexprbool operator<(/*unspecified*/ u, strong_ordering v)noexcept;
      (2)

      Parameters

      v - astd::strong_ordering value to check
      u - an unused parameter of any type that accepts literal zero argument

      Return value

      1)true ifv isless, andfalse ifv isgreater,equivalent, orequal
      2)true ifv isgreater, andfalse ifv isless,equivalent, orequal

      operator<=

      friendconstexprbool operator<=( strong_ordering v,/*unspecified*/ u)noexcept;
      (1)
      friendconstexprbool operator<=(/*unspecified*/ u, strong_ordering v)noexcept;
      (2)

      Parameters

      v - astd::strong_ordering value to check
      u - an unused parameter of any type that accepts literal zero argument

      Return value

      1)true ifv isless,equivalent, orequal, andfalse ifv isgreater
      2)true ifv isgreater,equivalent, orequal, andfalse ifv isless

      operator>

      friendconstexprbool operator>( strong_ordering v,/*unspecified*/ u)noexcept;
      (1)
      friendconstexprbool operator>(/*unspecified*/ u, strong_ordering v)noexcept;
      (2)

      Parameters

      v - astd::strong_ordering value to check
      u - an unused parameter of any type that accepts literal zero argument

      Return value

      1)true ifv isgreater, andfalse ifv isless,equivalent, orequal
      2)true ifv isless, andfalse ifv isgreater,equivalent, orequal

      operator>=

      friendconstexprbool operator>=( strong_ordering v,/*unspecified*/ u)noexcept;
      (1)
      friendconstexprbool operator>=(/*unspecified*/ u, strong_ordering v)noexcept;
      (2)

      Parameters

      v - astd::strong_ordering value to check
      u - an unused parameter of any type that accepts literal zero argument

      Return value

      1)true ifv isgreater,equivalent, orequal, andfalse ifv isless
      2)true ifv isless,equivalent, orequal, andfalse ifv isgreater

      operator<=>

      friendconstexpr strong_ordering
      operator<=>( strong_ordering v,/*unspecified*/ u)noexcept;
      (1)
      friendconstexpr strong_ordering
      operator<=>(/*unspecified*/ u, strong_ordering v)noexcept;
      (2)

      Parameters

      v - astd::strong_ordering value to check
      u - an unused parameter of any type that accepts literal zero argument

      Return value

      1)v.
      2)greater ifv isless,less ifv isgreater, otherwisev.

      [edit]Example

      Run this code
      #include <compare>#include <iostream> struct Point{int x{}, y{}; friendconstexpr std::strong_ordering operator<=>(Point lhs, Point rhs){if(lhs.x< rhs.x or(lhs.x== rhs.x and lhs.y< rhs.y))return std::strong_ordering::less;if(lhs.x> rhs.x or(lhs.x== rhs.x and lhs.y> rhs.y))return std::strong_ordering::greater;return std::strong_ordering::equivalent;} friendstd::ostream& operator<<(std::ostream& os, Point s){return os<<'('<< s.x<<','<< s.y<<')';}}; void print_three_way_comparison(constauto& p,constauto& q){constauto cmp{p<=> q};std::cout<< p<<(cmp<0?" <  ": cmp>0?" >  ":" == ")// compares with 0<< q<<'\n';} void print_two_way_comparison(constauto& p,constauto& q){std::cout<< p<<(p< q?" <  ": p> q?" >  ":" == ")// compares p and q<< q<<'\n';} int main(){const Point p1{0,1}, p2{0,1}, p3{0,2};     print_three_way_comparison(p1, p2);    print_two_way_comparison(p1, p2);     print_three_way_comparison(p2, p3);    print_two_way_comparison(p2, p3);     print_three_way_comparison(p3, p2);    print_two_way_comparison(p3, p2);}

      Output:

      (0,1) == (0,1)(0,1) == (0,1)(0,1) <  (0,2)(0,1) <  (0,2)(0,2) >  (0,1)(0,2) >  (0,1)

      [edit]See also

      the result type of 3-way comparison that supports all 6 operators and is not substitutable
      (class)[edit]
      the result type of 3-way comparison that supports all 6 operators, is not substitutable, and allows incomparable values
      (class)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/utility/compare/strong_ordering&oldid=173503"

      [8]ページ先頭

      ©2009-2025 Movatter.jp