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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::compare_three_way -	std::compare_three_way

Synopsis
	  Defined in header <compare>
	  Defined in header <functional>
	  struct compare_three_way;	  (since C++20)

	  Function  object  for	 performing comparisons. Deduces the parameter
       types and the
	  return type of the function call operator.

	 Implementation-defined	strict total order over	pointers

	  The function call operator yields the	implementation-defined	strict
       total order over
	  pointers  if	the  <=> operator between arguments invokes a built-in
       comparison
	  operator for a pointer, even if the built-in <=> operator does not.

	  The implementation-defined strict total order	is consistent with the
       partial order
	  imposed by built-in comparison operators (<=>, <, >,	<=,  and  >=),
       and consistent
	  among	following standard function objects:

	    *	   std::less,	   std::greater,      std::less_equal,	   and
       std::greater_equal, when	the
	      template argument	is a pointer type or void

	    *	     std::ranges::equal_to,	    std::ranges::not_equal_to,
       std::ranges::less,
	      std::ranges::greater,		      std::ranges::less_equal,
       std::ranges::greater_equal, and
	      std::compare_three_way

Member types
	  Member type	 Definition
	  is_transparent /* unspecified	*/

Member functions
	  operator() obtains the result	of three-way comparison	on both	 argu-
       ments
		     (public member function)

       std::compare_three_way::operator()

	  template< class T, class U >

	  requires  std::three_way_comparable_with<T, U> // with different se-
       mantic
	  requirements

	  constexpr auto operator()( T&& t, U&&	u ) const;

	  Compares t  and  u,  equivalent  to  return  std::forward<T>(t)  <=>
       std::forward<U>(u);,
	  except  when	that expression	resolves to a call to a	builtin	opera-
       tor<=> comparing
	  pointers.

	  When a call would not	invoke a built-in operator comparing pointers,
       the behavior is
	  undefined if std::three_way_comparable_with<T, U> is not modeled.

	  When a call would invoke a built-in operator comparing  pointers  of
       type P, the
	  result is instead determined as follows:

	    *  Returns	std::strong_ordering::less if the (possibly converted)
       value of	the
	      first argument precedes the (possibly converted)	value  of  the
       second argument in
	      the   implementation-defined  strict  total  ordering  over  all
       pointer values of type
	      P. This strict total ordering is consistent with the partial or-
       der imposed by
	      the builtin operators <, >, <=, and >=.
	    * Otherwise, returns  std::strong_ordering::greater	 if  (possibly
       converted) value
	      of  the  second argument precedes	the (possibly converted) value
       of the first
	      argument in the same strict total	ordering.
	    * Otherwise, returns std::strong_ordering::equal.

	  The behavior is undefined unless the conversion sequences from  both
       T and U to P are
	  equality-preserving (see below).

	 Equality preservation

	  An  expression is equality preserving	if it results in equal outputs
       given equal
	  inputs.

	    * The inputs to an expression consist of its operands.
	    * The outputs of an	expression  consist  of	 its  result  and  all
       operands	modified by
	      the expression (if any).

	  In  specification  of	standard concepts, operands are	defined	as the
       largest
	  subexpressions that include only:

	    * an id-expression,	and
	    * invocations of std::move,	std::forward, and std::declval.

	  The cv-qualification and value category of each  operand  is	deter-
       mined by	assuming
	  that	each template type parameter denotes a cv-unqualified complete
       non-array object
	  type.

	  Every	expression required to be equality preserving is  further  re-
       quired to be
	  stable:  two	evaluations  of	such an	expression with	the same input
       objects must have
	  equal	outputs	absent any explicit intervening	modification of	 those
       input objects.

Example
       // Run this code

	#include <iostream>
	#include <compare>

	struct Rational	{
	    int	num;
	    int	den; //	> 0

	    // Although	the comparison X <=> Y will work, a direct call
	    // to std::compare_three_way{}(X,Y)	requires the operator==
	    // be defined, to satisfy the std::three_way_comparable_with.
	    constexpr bool operator==(Rational const&) const = default;
	};

	constexpr std::weak_ordering operator<=>(Rational lhs, Rational	rhs)
	{
	    return lhs.num * rhs.den <=> rhs.num * lhs.den;
	}

	void print(std::weak_ordering value)
	{
	    value < 0 ?	std::cout << "less\n"	 :
	    value > 0 ?	std::cout << "greater\n" :
			std::cout << "equal\n"	 ;
	}

	int main()
	{
	    Rational a{6,5};
	    Rational b{8,7};
	    print(a <=>	b);
	    print(std::compare_three_way{}(a,b));
	}

Output:
	greater
	greater

	 Defect	reports

	  The following	behavior-changing defect reports were applied retroac-
       tively to
	  previously published C++ standards.

	     DR	    Applied to	       Behavior	as published		  Cor-
       rect behavior
	  LWG 3530 C++20      syntactic	checks were relaxed while    only  se-
       mantic requirements
			      comparing	pointers		    relaxed

See also
	  ranges::equal_to	function object	implementing x == y
	  (C++20)		(class)
	  ranges::not_equal_to	function object	implementing x != y
	  (C++20)		(class)
	  ranges::less		function object	implementing x < y
	  (C++20)		(class)
	  ranges::greater	function object	implementing x > y
	  (C++20)		(class)
	  ranges::less_equal	function object	implementing x <= y
	  (C++20)		(class)
	  ranges::greater_equal	function object	implementing x >= y
	  (C++20)		(class)

http://cppreference.com		  2022.07.31	     std::compare_three_way(3)

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

home | help