Namensräume
Varianten
Aktionen

std::ranges::iter_swap

Von cppreference.com
< cpp‎ | iterator
 
 
Iterator-Bibliothek
Iterator-Konzepte
Iterator-Primitive
Algorithmus-Konzepte und Hilfsprogramme
Indirekte aufrufbare Konzepte
Gemeinsame Algorithmus-Anforderungen
(C++20)
(C++20)
(C++20)
Dienstprogramme
(C++20)
Iterator-Adapter
Iterator-Anpassungspunkte
ranges::iter_swap
(C++20)
Bereichszugriff
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
Definiert in Header <iterator>
namespace ranges {

    inline namespace /* nicht spezifiziert */ {
        inline constexpr /* nicht spezifiziert */
            iter_swap = /* 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>
    iter-exchange-move( X&& x, Y&& y )
    noexcept(noexcept(std::iter_value_t<X>(std::ranges::iter_move(x))) &&

             noexcept(*x = std::ranges::iter_move(y)));
(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

  1. (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_swap mit dem zusätzlichen Kandidaten void iter_swap(auto, auto) = delete;[1] durchgeführt wird, wobei std::ranges::iter_swap selbst ausgeschlossen ist.
    • Wenn die ausgewählte Überladung den von i1 und i2 bezeichneten Wert nicht vertauscht, ist das Programm schlecht geformt, keine Diagnose erforderlich.
  2. Andernfalls ranges::swap(*i1, *i2), wenn sowohl I1 als auch I2 indirectly_readable modellieren und wenn std::iter_reference_t<I1> und std::iter_reference_t<I2> swappable_with modellieren.
  3. 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.
  4. 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.
  1. 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

Andernfalls nimmt kein operator() von __iter_swap_fn an der Überladungsauflösung teil.

[bearbeiten] Beispiel

[bearbeiten] Siehe auch

(C++20)
tauscht die Objekte, auf die von zwei angepassten zugrunde liegenden Iteratoren gezeigt wird
(Funktionstemplate) [edit]
(C++20)
tauscht die Objekte, auf die zwei zugrundeliegende Iteratoren zeigen
(Funktionstemplate) [edit]
Tauscht die Elemente, auf die zwei Iteratoren zeigen
(Funktionstempelat) [edit]