std::ranges::cbegin(3)
okay so this is the std::ranges::cbegin(3) page from the C++ Standard Libary, and we are gonna make it make sense, bestie πβ¨
β¨ NAME β¨
std::ranges::cbeginβstd::ranges::cbegin(yes, that is the whole name section, she said what she said π )
πΈ Synopsis πΈ
Defined in header <ranges>
Defined in header <iterator>
inline namespace /* unspecified */ {
inline constexpr /* unspecified */ cbegin = /* (since C++20)
unspecified */;
(customization point object)
}
Call signature
template< class T >
requires /* see below */ (since C++20)
constexpr /* see below */ auto cbegin( T&& t );
Until C++23, this returns an iterator to the first element of the const-qualified argument. Since C++23, it returns a constant iterator to the first element of the argument. π¦
There is also a diagram named range-begin-end.svg on the page β not me inventing lore, that is literally the file name π
Let CT be (this whole definition is until C++23, bestie):
const std::remove_reference_t<T>&if the argument is an lvalue (i.e.Tis an lvalue reference type),const Totherwise.
A call to ranges::cbegin is expression-equivalent to ranges::begin(static_cast<CT&&>(t)).
If the argument is an lvalue or ranges::enable_borrowed_range<std::remove_cv_t<T>> is true, then a call to ranges::cbegin is expression-equivalent to:
std::const_iterator<decltype(U)>(U)for some expressionUequivalent toranges::begin(/*possibly-const-range*/(t)).(since C++23)
In all other cases, a call to ranges::cbegin is ill-formed, which can result in substitution failure when the call appears in the immediate context of a template instantiation. π
The return type models std::input_or_output_iterator and constant-iterator (since C++23) in all cases.
π Notes π
For an lvalue range e of type T, ranges::cbegin(e) is equivalent to:
ranges::begin(std::as_const(e)).
(until C++23)
And since C++23, it is equivalent to:
ranges::begin(e)ifTmodelsconstant_range.- Otherwise,
ranges::begin(std::as_const(e))ifconst Tmodelsconstant_range. - Otherwise,
std::basic_const_iterator(ranges::begin(e)).
π§ Example π§
The page says // Run this code, so here is the whole thing, no cap:
// Run this code
#include <cassert>
#include <ranges>
#include <vector>
int main()
{
std::vector v{3, 1, 4};
auto vi = std::ranges::cbegin(v);
assert(3 == *vi);
++vi; // OK, constant-iterator object is mutable
assert(1 == *vi);
// *vi = 13; // Error: constant-iterator points to an immutable element
int a[]{3, 1, 4};
auto ai = std::ranges::cbegin(a); // cbegin works with C-arrays as well
assert(3 == *ai and *(ai + 1) == 1);
// *ai = 13; // Error: read-only variable is not assignable
}
π See also π
ranges::beginβ returns an iterator to the beginning of a range (C++20) (customization point object)beginβ (listed all by itself on the page; no extra description attached, bestie π )cbeginβ returns an iterator to the beginning of a container or array (C++11) (function template) (C++14)
okay bye bestie, this was the std::ranges::cbegin(3) page from http://cppreference.com, dated 2024.06.10 β mwah πβ¨
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms