std::ranges::iter_swap
| Definiert in Header <iterator> |
||
| namespace ranges { inline namespace /* nicht spezifiziert */ { |
(seit C++20) (Customization-Point-Objekt) |
|
| Aufruf-Signatur |
||
| template< class I1, class I2 > constexpr void iter_swap( I1&& i1, I2&& i2 ) noexcept(/* siehe unten */); |
(seit C++20) | |
| Hilfsfunktion |
||
| template< class X, class Y > constexpr std::iter_value_t<X> |
(nur Exposition*) | |
Tauscht die von zwei Iteratoren bezeichneten Werte.
Die Auswirkung der Hilfsfunktion iter-exchange-move, die nur für die Exposition existiert, ist äquivalent zu
std::iter_value_t<X> old(std::ranges::iter_move(x)); *x = std::ranges::iter_move(y); return old;
ranges::iter_swap(i1, i2) ist ausdrucksäquivalent zu
- (void)iter_swap(i1, i2), wenn i1 oder i2 einen Klassen- oder Enumerationstyp hat und der Ausdruck wohlgeformt ist, wobei die Überladungsauflösung von
iter_swapmit dem zusätzlichen Kandidaten void iter_swap(auto, auto) = delete;[1] durchgeführt wird, wobeistd::ranges::iter_swapselbst ausgeschlossen ist.- Wenn die ausgewählte Überladung den von i1 und i2 bezeichneten Wert nicht vertauscht, ist das Programm schlecht geformt, keine Diagnose erforderlich.
- Andernfalls ranges::swap(*i1, *i2), wenn sowohl
I1als auchI2indirectly_readablemodellieren und wenn std::iter_reference_t<I1> und std::iter_reference_t<I2>swappable_withmodellieren. - Andernfalls (void)(*i1 =
iter-exchange-move(i2, i1)), wenn std::indirectly_movable_storable<I1, I2> und std::indirectly_movable_storable<I2, I1> beide modelliert sind, mit der Ausnahme, dass i1 nur einmal ausgewertet wird. - Andernfalls ist ranges::iter_swap(i1, i2) schlecht geformt, was zu Substitutionsfehler führen kann, wenn ranges::iter_swap(i1, i2) im unmittelbaren Kontext einer Template-Instanziierung auftritt.
- ↑ Dies schließt den Aufruf von unbeschränktem std::iter_swap aus.
Customization Point Objects
Der Name ranges::iter_swap bezeichnet ein Customization Point Object (CPO), ein konstantes Funktionsobjekt eines literalen semiregular-Klassentyps. Zu Ausstellungszwecken wird die cv-unqualifizierte Version seines Typs als __iter_swap_fn bezeichnet.
Alle Instanzen von __iter_swap_fn sind gleich. Die Auswirkungen des Aufrufs verschiedener Instanzen vom Typ __iter_swap_fn mit denselben Argumenten sind äquivalent, unabhängig davon, ob der Ausdruck, der die Instanz bezeichnet, ein lvalue oder rvalue ist und ob er const-qualifiziert ist oder nicht (eine volatile-qualifizierte Instanz muss jedoch nicht aufrufbar sein). Daher kann ranges::iter_swap frei kopiert werden und seine Kopien können austauschbar verwendet werden.
Gegeben eine Menge von Typen Args..., wenn std::declval<Args>()... die Anforderungen für Argumente an ranges::iter_swap erfüllen, modelliert __iter_swap_fn
- std::invocable<__iter_swap_fn, Args...>,
- std::invocable<const __iter_swap_fn, Args...>,
- std::invocable<__iter_swap_fn&, Args...>, und
- std::invocable<const __iter_swap_fn&, Args...>.
Andernfalls nimmt kein operator() von __iter_swap_fn an der Überladungsauflösung teil.
[bearbeiten] Beispiel
| Dieser Abschnitt ist unvollständig Grund: kein Beispiel |
[bearbeiten] Siehe auch
| (C++20) |
tauscht die Objekte, auf die von zwei angepassten zugrunde liegenden Iteratoren gezeigt wird (Funktionstemplate) |
| (C++20) |
tauscht die Objekte, auf die zwei zugrundeliegende Iteratoren zeigen (Funktionstemplate) |
| Tauscht die Elemente, auf die zwei Iteratoren zeigen (Funktionstempelat) |