std::ranges::sized_range, std::ranges::disable_sized_range
Von de.cppreference.net
| Definiert in Header <ranges>
|
||
template< class T >
concept sized_range = ranges::range<T> &&
requires(T& t) {
ranges::size(t);
};
|
(1) | (seit C++20) (bis C++26) |
template< class T >
concept sized_range = ranges::approximately_sized_range<T> &&
requires(T& t) {
ranges::size(t);
};
|
(seit C++26) | |
template< class >
constexpr bool disable_sized_range = false;
|
(2) | (seit C++20) |
1) Das
sized_range-Konzept spezifiziert die Anforderungen eines range(bis C++26)approximately_sized_range(seit C++26)-Typs, der seine Größe in konstanter Zeit mit der size-Funktion kennt.2) Das
disable_sized_range-Template existiert, um die Verwendung von Bereichstypen zu erlauben, die eine size-Funktion bereitstellen (entweder als Member oder als Nicht-Member), aber tatsächlich nicht sized_range modellieren. Benutzer können disable_sized_range für cv-unqualifizierte, programmdefinierte Typen spezialisieren. Solche Spezialisierungen müssen in konstanten Ausdrücken verwendbar sein und den Typ const bool haben.Semantische Anforderungen
1)
Gegeben einen Lvalue
t
vom Typ
std::
remove_reference_t
<
T
>
,
T
modelliert
sized_range
nur wenn
- ranges:: size ( t )
-
- amortisierte konstante Zeitkomplexität besitzt,
- den Wert von t nicht in einer für gleichheitserhaltende Ausdrücke beobachtbaren Weise verändert, und
- gleich ranges:: distance ( ranges:: begin ( t ) , ranges:: end ( t ) ) ist, und
-
wenn
ranges::
iterator_t
<
T
>
forward_iteratormodelliert, ranges:: size ( t ) unabhängig von der Auswertung von ranges:: begin ( t ) wohldefiniert ist (mit anderen Worten: Ein Single-Pass Sized Range könnte size nur vor dem ersten Aufruf von begin unterstützen, aber ein Forward Range muss size zu jeder Zeit unterstützen).
Hinweise
disable_sized_range
kann nicht verwendet werden, um einen Bereich abzuwählen, dessen Iterator und Sentinel
sized_sentinel_for
erfüllen;
std::disable_sized_sentinel_for
muss stattdessen verwendet werden.
disable_sized_range
kann nicht für Array-Typen oder Referenztypen spezialisiert werden.
| Feature-Test Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_ranges_reserve_hint
|
202502L
|
(C++26) | ranges::approximately_sized_range und ranges::reserve_hint |
Beispiel
Diesen Code ausführen
#include <forward_list> #include <list> #include <ranges> static_assert ( std::ranges::sized_range<std::list<int>> and not std::ranges::sized_range<std::forward_list<int>> ); int main() {}
Siehe auch
|
(C++20)
|
spezifiziert einen Bereich, dessen Iteratortyp
random_access_iterator
erfüllt
(Konzept) |
|
(C++20)
|
spezifiziert einen Bereich, dessen Iteratortyp
contiguous_iterator
erfüllt
(Konzept) |