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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::strong_order - std::strong_order

Synopsis
	  Defined in header <compare>
	  inline namespace /* unspecified */ {

	  inline constexpr /* unspecified */ strong_order = /* unspecified */;
       (since C++20)

	  }
	  Call signature
	  template< class T, class U >

	  requires /* see below	*/

	  constexpr std::strong_ordering strong_order( T&& t, U&& u )
	  noexcept(/* see below	*/);

	  Compares  two	values using 3-way comparison and produces a result of
       type
	  std::strong_ordering

	  Let t	and u be expressions and T and U denote	decltype((t)) and  de-
       cltype((u))
	  respectively,	std::strong_order(t, u)	is expression-equivalent to:

	    * If std::is_same_v<std::decay_t<T>, std::decay_t<U>> is true:

		 *  std::strong_ordering(strong_order(t, u)), if it is a well-
       formed expression
		   with	overload resolution performed in a context  that  does
       not include a
		   declaration of std::strong_order,
		 * otherwise, if T is a	floating-point type:

		      *	if std::numeric_limits<T>::is_iec559 is	true, performs
       the
			ISO/IEC/IEEE  60559 totalOrder comparison of floating-
       point values and
			returns	that result as a value of type std::strong_or-
       dering (note:
			this comparison	can distinguish	between	 the  positive
       and negative zero
			and between the	NaNs with different representations),
		      *	otherwise, yields a value of type std::strong_ordering
       that is
			consistent  with the ordering observed by T's compari-
       son operators,

		 * otherwise, std::strong_ordering(std::compare_three_way()(t,
       u)) if it is
		   well-formed.

	    * In all other cases, the expression is ill-formed,	which can  re-
       sult in
	      substitution failure when	it appears in the immediate context of
       a template
	      instantiation.

	 Expression-equivalent

	  Expression e is expression-equivalent	to expression f, if

	    * e	and f have the same effects, and
	    *  either  both  are  constant subexpressions or else neither is a
       constant
	      subexpression, and
	    * either both are potentially-throwing or else neither  is	poten-
       tially-throwing
	      (i.e. noexcept(e)	== noexcept(f)).

	 Customization point objects

	  The  name  std::strong_order	denotes	 a customization point object,
       which is	a const
	  function object of a literal semiregular class type. For  exposition
       purposes, the
	  cv-unqualified version of its	type is	denoted	as __strong_order_fn.

	  All  instances of __strong_order_fn are equal. The effects of	invok-
       ing different
	  instances of type __strong_order_fn on the same arguments are	equiv-
       alent, regardless
	  of whether the expression denoting the  instance  is	an  lvalue  or
       rvalue, and is
	  const-qualified  or  not  (however, a	volatile-qualified instance is
       not required to be
	  invocable). Thus, std::strong_order can be  copied  freely  and  its
       copies can be used
	  interchangeably.

	  Given	 a  set	 of types Args..., if std::declval<Args>()... meet the
       requirements for
	  arguments to std::strong_order above,	__strong_order_fn models

	    * std::invocable<__strong_order_fn,	Args...>,
	    * std::invocable<const __strong_order_fn, Args...>,
	    * std::invocable<__strong_order_fn&, Args...>, and
	    * std::invocable<const __strong_order_fn&, Args...>.

	  Otherwise, no	function call operator of  __strong_order_fn  partici-
       pates in	overload
	  resolution.

Notes
	   Strict total	order of IEEE floating-point types

	  Let  x  and  y  be  values of	same IEEE floating-point type, and to-
       tal_order_less(x, y)
	  be the boolean result	indicating if x	precedes y in the strict total
       order defined
	  by totalOrder	in ISO/IEC/IEEE	60559.

	  (total_order_less(x, y) || total_order_less(y, x)) ==	false  if  and
       only if x and y
	  have the same	bit pattern.

	    * if neither x nor y is NaN:

		 * if x	< y, then total_order_less(x, y) == true;
		 * if x	> y, then total_order_less(x, y) == false;
		 * if x	== y,

		      *	 if  x	is  negative  zero and y is positive zero, to-
       tal_order_less(x, y)
			== true,
		      *	if x is	not zero and x's exponent field	is  less  than
       y's, then
			total_order_less(x, y) == (x > 0) (only	meaningful for
       decimal
			floating-point number);

	    * if either	x or y is NaN:

		 *  if	x  is negative NaN and y is not	negative NaN, then to-
       tal_order_less(x, y)
		   == true,
		 * if x	is not positive	NaN and	y is positive  NaN,  then  to-
       tal_order_less(x, y)
		   == true,
		 *  if	both  x	and y are NaNs with the	same sign and x's man-
       tissa field is less
		   than	y's, then total_order_less(x, y) == !std::signbit(x).

Example
	   This	section	is incomplete
	   Reason: no example

See also
	  strong_ordering		the result type	 of  3-way  comparison
       that supports all
	  (C++20)			6 operators and	is substitutable
					(class)
	  weak_order			performs 3-way comparison and produces
       a result	of
	  (C++20)			type std::weak_ordering
					(customization point object)
	  partial_order			performs 3-way comparison and produces
       a result	of
	  (C++20)			type std::partial_ordering
					(customization point object)
					performs 3-way comparison and produces
       a result	of
	  compare_strong_order_fallback	type std::strong_ordering, even	if op-
       erator<=> is
	  (C++20)			unavailable
					(customization point object)

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

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

home | help