std::ranges::sized_range, std::ranges::disable_sized_range
Von cppreference.com
| Definiert in der Header-Datei <ranges> |
||
| template< class T > Konzept sized_range = ranges::range<T> && |
(1) | (seit C++20) |
| template< class > constexpr bool disable_sized_range = false; |
(2) | (seit C++20) |
1) Das
sized_range-Konzept spezifiziert die Anforderungen an einen range-Typ, der seine Größe in konstanter Zeit mit der Funktion size kennt.2)
disable_sized_range existiert, um die Verwendung von Range-Typen zu ermöglichen, die eine size-Funktion (entweder als Member oder als nicht-Member) bereitstellen, aber nicht tatsächlich sized_range modellieren. Benutzer können disable_sized_range für cv-unqualifizierte, benutzerdefinierte Typen spezialisieren. Solche Spezialisierungen müssen in Konstanten Ausdrücken verwendbar sein und den Typ const bool haben.Inhalt |
[edit] Semantische Anforderungen
1) Gegeben ein lvalue
t vom Typ std::remove_reference_t<T>, modelliert T sized_range nur, wenn- ranges::size(t)
- amortisierte konstante Zeitkomplexität hat,
- den Wert von
tnicht auf eine für gleichheitserhaltende Ausdrücke beobachtbare Weise verändert und - gleich ranges::distance(ranges::begin(t), ranges::end(t)) ist und
- wenn ranges::iterator_t<T>
forward_iteratormodelliert, ist ranges::size(t) unabhängig von der Auswertung von ranges::begin(t) wohldefiniert (mit anderen Worten: ein Single-Pass sized range kann einen Aufruf von size nur vor dem ersten Aufruf von begin unterstützen, aber ein forward range muss size jederzeit unterstützen).
[edit] Anmerkungen
disable_sized_range kann nicht verwendet werden, um einen Range zu deaktivieren, dessen Iterator und Sentinel sized_sentinel_for erfüllen; stattdessen muss std::disable_sized_sentinel_for verwendet werden.
disable_sized_range kann nicht für Array-Typen oder Referenztypen spezialisiert werden.
[edit] Beispiel
Führen Sie diesen Code aus
#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() {}
[edit] Siehe auch
| (C++20) |
spezifiziert einen Range, dessen Iteratortyp random_access_iterator erfüllt(Konzept) |
| (C++20) |
spezifiziert einen Range, dessen Iteratortyp contiguous_iterator erfüllt(Konzept) |