Namespaces
Variants

std::experimental::ranges:: swap

From cppreference.net
namespace {

constexpr /* unspecified */ swap = /* unspecified */ ;

}
(ranges TS)
(Anpassungspunktobjekt)
Aufrufsignatur
template < class T, class U >

requires /* siehe unten */

void swap ( T && t, U && u ) noexcept ( /* siehe unten */ ) ;

Tauscht die Werte aus, auf die t und u verweisen.

Ein Aufruf von ranges::swap ist äquivalent zu:

1) ( void ) swap ( std:: forward < T > ( t ) , std:: forward < U > ( u ) ) , falls dieser Ausdruck gültig ist, wobei die Überladungsauflösung mit den folgenden Kandidaten durchgeführt wird:
  • template < class T > void swap ( T & , T & ) = delete ;
  • template < class T, std:: size_t N > void swap ( T ( & ) [ N ] , T ( & ) [ N ] ) = delete ;
  • alle Deklarationen von swap , die durch argumentabhängige Suche gefunden werden.
Wenn die durch Überladungsauflösung ausgewählte Funktion nicht die Werte vertauscht, auf die t und u verweisen, ist das Programm fehlerhaft; keine Diagnose erforderlich.
2) Andernfalls, ( void ) ranges:: swap_ranges ( t, u ) , falls T und U Lvalue-Referenzen auf Array-Typen gleicher Ausdehnung (aber möglicherweise unterschiedlicher Elementtypen) sind und ranges:: swap ( * t, * u ) ein gültiger Ausdruck ist.
3) Andernfalls, wenn T und U beide V& für einen Typ V sind, der die syntaktischen Anforderungen von MoveConstructible < V > und Assignable < V & , V > erfüllt, tauscht die referenzierten Werte wie durch V v { std :: move ( t ) } ; t = std :: move ( u ) ; u = std :: move ( v ) ; . Wenn die semantischen Anforderungen eines der Konzepte nicht erfüllt sind, ist das Programm fehlerhaft; keine Diagnose erforderlich.
4) In allen anderen Fällen ist ein Aufruf von ranges::swap fehlerhaft.

ranges:: swap kann in einem konstanten Ausdruck verwendet werden, wenn jede Funktion, die es aufruft (wie oben spezifiziert), ebenfalls so verwendet werden kann.

Inhaltsverzeichnis

Customization Point Objects

Der Name ranges::swap bezeichnet ein Customization Point Object , welches ein Funktionsobjekt eines Literal Semiregular -Klassentyps ist (zur Veranschaulichung als SwapT bezeichnet). Alle Instanzen von SwapT sind gleich. Daher kann ranges::swap frei kopiert werden und seine Kopien können austauschbar verwendet werden.

Gegeben eine Menge von Typen Args... , falls std:: declval < Args > ( ) ... die Anforderungen für Argumente von ranges::swap oben erfüllen, wird SwapT ranges :: Invocable < const SwapT, Args... > erfüllen. Andernfalls beteiligt sich kein Funktionsaufrufoperator von SwapT an der Überladungsauflösung.

In jeder Übersetzungseinheit, in der ranges::swap definiert ist, verweist es auf dieselbe Instanz des Customization Point Objects. (Dies bedeutet, dass es frei in Dingen wie Inline-Funktionen und Funktionsvorlagen verwendet werden kann, ohne das One-Definition-Rule zu verletzen.)

Exceptions

1)
noexcept Spezifikation:
noexcept ( noexcept ( ( void ) swap ( std:: forward < T > ( t ) , std:: forward < T > ( u ) ) ) )
, wobei swap wie oben beschrieben gefunden wird.
2)
noexcept Spezifikation:
noexcept ( noexcept ( ranges:: swap ( * t, * u ) ) )
3)
noexcept Spezifikation:

Beispiel

Siehe auch

tauscht die Werte zweier Objekte
(Funktions-Template)