std::ranges::begin, std::ranges::cbegin
Defined in header <ranges>
|
||
Defined in header <iterator>
|
||
inline namespace /*unspecified*/ { inline constexpr /*unspecified*/ begin = /*unspecified*/; |
(1) | (since C++20) (customization point object) |
inline namespace /*unspecified*/ { inline constexpr /*unspecified*/ cbegin = /*unspecified*/; |
(2) | (since C++20) (customization point object) |
Let t
be an object of type T
.
ranges::enabled_borrowed_range<T> == false
, then ranges::begin(t)
is ill-formed.ranges::begin
is expression-equivalent to:
- t + 0 if
T
is an array type andstd::remove_all_extents_t<T>
is a complete type. - If
std::remove_all_extents_t<T>
is incomplete, then ranges::begin(std::forward<T>(t)) is ill-formed, no diagnostic required. - Otherwise, std::forward<T>(t).begin(), if that expression is valid, and its return type models
std::input_or_output_iterator
. - Otherwise, begin(std::forward<T>(t)), if
T
is a class or enumeration type, and the aforementioned unqualified call is valid, where the overload resolution is performed with the following candidates:- void begin(auto&) = delete;
- void begin(const auto&) = delete;
- any declarations of
begin
found by argument-dependent lookup.
ranges::begin
is ill-formed, which can result in substitution failure when ranges::begin(t) appears in the immediate context of a template instantiation.ranges::cbegin
is expression-equivalent to:The returned object models std::input_or_output_iterator
in both cases.
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::begin
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 __begin_fn
.
All instances of __begin_fn
are equal. The effects of invoking different instances of type __begin_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::begin
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::begin
above, __begin_fn
models
- std::invocable<__begin_fn, Args...>,
- std::invocable<const __begin_fn, Args...>,
- std::invocable<__begin_fn&, Args...>, and
- std::invocable<const __begin_fn&, Args...>.
Otherwise, no function call operator of __begin_fn
participates in overload resolution.
See also
(C++11)(C++14) |
returns an iterator to the beginning of a container or array (function template) |