Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::strong_ordering(3)	      C++ Standard Libary      std::strong_ordering(3)

NAME
       std::strong_ordering - std::strong_ordering

Synopsis
	  Defined in header <compare>
	  class	strong_ordering;       (since C++20)

	  The  class  type std::strong_ordering	is the result type of a	three-
       way comparison
	  that:

	    * Admits all six relational	operators (==, !=, <, <=, >, >=).
	    * Implies substitutability:	if a is	equivalent to b, f(a) is  also
       equivalent to
	      f(b),  where  f  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	of a < b, a ==
       b, or a > b must
	      be true.

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

	  Member constant	       Definition
	  less(inline	constexpr)	   a   valid   value   of   the	  type
       std::strong_ordering
	  [static]		       indicating less-than  (ordered  before)
       relationship
				       (public static member constant)
				       a    valid    value    of    the	  type
       std::strong_ordering
	  equivalent(inline constexpr) indicating equivalence (neither ordered
       before nor
	  [static]		       ordered after), the same	as equal
				       (public static member constant)
				       a   valid    value    of	   the	  type
       std::strong_ordering
	  equal(inline constexpr)      indicating equivalence (neither ordered
       before nor
	  [static]		       ordered after), the same	as equivalent
				       (public static member constant)
	  greater(inline   constexpr)	   a   valid   value   of   the	  type
       std::strong_ordering
	  [static]		       indicating greater-than (ordered	after)
       relationship
				       (public static member constant)

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

	  operator partial_ordering implicit conversion	to std::partial_order-
       ing
				    (public member function)

       std::strong_ordering::operator partial_ordering

	  constexpr operator partial_ordering()	const noexcept;

Return value
	  std::partial_ordering::less  if  v  is   less,   std::partial_order-
       ing::greater if v is
	  greater,  std::partial_ordering::equivalent if v is equal or equiva-
       lent.

	  operator weak_ordering implicit conversion to	std::weak_ordering
				 (public member	function)

       std::strong_ordering::operator weak_ordering

	  constexpr operator weak_ordering() const noexcept;

Return value
	  std::weak_ordering::less if v	is  less,  std::weak_ordering::greater
       if v is greater,
	  std::weak_ordering::equivalent if v is equal or equivalent.

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

	  These	functions are not visible to ordinary unqualified or qualified
       lookup, and can
	  only be found	by argument-dependent lookup when std::strong_ordering
       is an
	  associated class of the arguments.

	  The behavior of a program that attempts to compare a strong_ordering
       with anything
	  other	than the integer literal 0 is undefined.

	  operator==
	  operator<
	  operator>   compares with zero or a strong_ordering
	  operator<=  (function)
	  operator>=
	  operator<=>

       operator==

	  friend			 constexpr			  bool
       (1)
	  operator==( strong_ordering v, /*unspecified*/ u ) noexcept;
	  friend			constexpr			  bool
       (2)
	  operator==(  strong_ordering	v,  strong_ordering w )	noexcept = de-
       fault;

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

Return value
	  1) true if v is equivalent or	equal, false if	v is less or greater
	  2) true if both parameters hold the  same  value,  false  otherwise.
       Note that equal is
	  the same as equivalent.

       operator<

	  friend  constexpr bool operator<( strong_ordering v, /*unspecified*/
       u )	   (1)
	  noexcept;
	  friend constexpr bool	operator<( /*unspecified*/ u,  strong_ordering
       v )	   (2)
	  noexcept;

Parameters
	  v - a	std::strong_ordering value to check
	  u  - an unused parameter of any type that accepts literal zero argu-
       ment

Return value
	  1) true if v is less,	and false if  v	 is  greater,  equivalent,  or
       equal
	  2)  true  if	v  is  greater,	and false if v is less,	equivalent, or
       equal

       operator<=

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

Parameters
	  v - a	std::strong_ordering value to check
	  u - an unused	parameter of any type that accepts literal zero	 argu-
       ment

Return value
	  1)  true  if	v  is  less,  equivalent,  or equal, and false if v is
       greater
	  2) true if v is greater, equivalent, or equal, and  false  if	 v  is
       less

       operator>

	  friend  constexpr bool operator>( strong_ordering v, /*unspecified*/
       u )	   (1)
	  noexcept;
	  friend constexpr bool	operator>( /*unspecified*/ u,  strong_ordering
       v )	   (2)
	  noexcept;

Parameters
	  v - a	std::strong_ordering value to check
	  u  - an unused parameter of any type that accepts literal zero argu-
       ment

Return value
	  1) true if v is greater, and false if	 v  is	less,  equivalent,  or
       equal
	  2)  true  if	v  is  less, and false if v is greater,	equivalent, or
       equal

       operator>=

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

Parameters
	  v - a	std::strong_ordering value to check
	  u - an unused	parameter of any type that accepts literal zero	 argu-
       ment

Return value
	  1)  true  if	v  is greater, equivalent, or equal, and false if v is
       less
	  2) true if v is less,	equivalent,  or	 equal,	 and  false  if	 v  is
       greater

       operator<=>

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

Parameters
	  v - a	std::strong_ordering value to check
	  u  - an unused parameter of any type that accepts literal zero argu-
       ment

Return value
	  1) v.
	  2) greater if	v is less, less	if v is	greater, otherwise v.

Example
       // Run this code

	#include <compare>
	#include <iostream>

	struct Point
	{
	    int	x{}, y{};

	    friend constexpr 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;
	    }

	    friend std::ostream& operator<<(std::ostream& os, Point s)
	    {
		return os << '(' << s.x	<< ',' << s.y << ')';
	    }
	};

	void print_three_way_comparison(const auto& p, const auto& q)
	{
	    const auto cmp{p <=> q};
	    std::cout << p
		      << (cmp <	0 ? " <	 " : cmp > 0 ? " >  " :	" ==  "	 )  //
       compares	with 0
		      << q << '\n';
	}

	void print_two_way_comparison(const auto& p, const auto& q)
	{
	    std::cout << p
		      <<  (p  <	 q ? " <  " : p	> q ? "	>  " : " == ") // com-
       pares 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)

See also
	  weak_ordering	   the result type of 3-way comparison	that  supports
       all 6 operators
	  (C++20)	   and is not substitutable
			   (class)
	  partial_ordering  the	 result	type of	3-way comparison that supports
       all 6 operators,
	  (C++20)	   is not substitutable, and allows incomparable  val-
       ues
			   (class)

http://cppreference.com		  2024.06.10	       std::strong_ordering(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::strong_ordering&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help