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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::ranges::size - std::ranges::size

Synopsis
	  Defined in header <ranges>
	  inline namespace /*unspecified*/ {
							 (since	C++20)
	  inline  constexpr auto size =	/*unspecified*/;  (customization point
       object)

	  }
	  Call signature
	  template< class T >

	  requires /* see below	*/			 (since	C++20)

	  constexpr auto size( T&& t );

	  Calculates the number	of elements in t in constant time.

	  Let t	be an object of	type T.	A call to ranges::size is  expression-
       equivalent to:

	   1. std::extent_v<T>,	if T is	an array type with a known bound.
	   2. Otherwise, t.size() converted to its decayed type, if
	      ranges::disable_sized_range<std::remove_cv_t<T>>	is  false, and
       the converted
	      expression is valid and has an integer-like type.
	   3. Otherwise, size(t) converted to its decayed type,	if
	      ranges::disable_sized_range<std::remove_cv_t<T>> is  false,  and
       the converted
	      expression  is  valid  and  has  an integer-like type, where the
       overload	resolution
	      is performed with	the following candidates:

		 * void	size(auto&) = delete;
		 * void	size(const auto&) = delete;

	   4.  Otherwise,  /*to-unsigned-like*/(ranges::end(t)	-  ranges::be-
       gin(t)),	if T models
	      ranges::forward_range and	ranges::sentinel_t<T> models
	      std::sized_sentinel_for<ranges::iterator_t<T>>,

			   where /*to-unsigned-like*/ denotes an explicit con-
       version to an
			   unsigned-integer-like type.

	  In  all other	cases, a call to ranges::size is ill-formed, which can
       result in
	  substitution failure when ranges::size(t) 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 ranges::size	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 __size_fn.

	  All instances	of __size_fn are equal.	The effects of	invoking  dif-
       ferent instances	of
	  type	__size_fn  on the same arguments are equivalent, 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,
	  ranges::size can be copied freely and	its copies can be used	inter-
       changeably.

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

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

	  Otherwise, no	function call operator of  __size_fn  participates  in
       overload
	  resolution.

Notes
	  Whenever  ranges::size(e)  is	 valid for an expression e, the	return
       type is
	  integer-like.

	  The C++20 standard requires that if  the  underlying	size  function
       call returns a
	  prvalue,  the	return value is	move-constructed from the materialized
       temporary
	  object. All implementations directly return the prvalue instead. The
       requirement is
	  corrected by the post-C++20 proposal P0849R8 to match	the  implemen-
       tations.

Example
       // Run this code

	#include <iostream>
	#include <ranges>
	#include <type_traits>
	#include <vector>

	int main()
	{
	    auto v = std::vector<int>{};
	    std::cout  <<  "ranges::size(v)  ==	 "  << std::ranges::size(v) <<
       '\n';

	    auto il = {7};
	    std::cout << "ranges::size(il) == "	 <<  std::ranges::size(il)  <<
       '\n';

	    int	array[]	= {4, 5}; // array has a known bound
	    std::cout << "ranges::size(array) == " << std::ranges::size(array)
       << '\n';

	    std::cout << std::boolalpha	<< "is_signed: "
		      <<  std::is_signed_v<decltype(std::ranges::size(v))>  <<
       '\n';
	}

Output:
	ranges::size(v)	== 0
	ranges::size(il) == 1
	ranges::size(array) == 2
	is_signed: false

See also
	  ranges::ssize	      returns a	signed integer equal to	the size of  a
       range
	  (C++20)	      (customization point object)
	  ranges::sized_range  specifies  that	a range	knows its size in con-
       stant time
	  (C++20)	      (concept)
	  size
	  ssize		      returns the size of a container or array
	  (C++17)	      (function	template)
	  (C++20)

http://cppreference.com		  2022.07.31		  std::ranges::size(3)

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

home | help