GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
std::ranges::size(3) C++ Standard Libary std::ranges::size(3)

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


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::begin(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 conversion 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 potentially-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 different 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 interchangeably.


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.


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 implementations.

// 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';
}


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


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 constant time
(C++20) (concept)
size
ssize returns the size of a container or array
(C++17) (function template)
(C++20)

2022.07.31 http://cppreference.com

Search for    or go to Top of page |  Section 3 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.