Es scheint, dass (2) ( freistehend swap
im selben Namespace, in dem die benutzerdefinierte Klasse deklariert ist ) die einzige zulässige Möglichkeit ist, swap
eine benutzerdefinierte Klasse bereitzustellen , da das Hinzufügen von Deklarationen zum Namespace std
im Allgemeinen ein undefiniertes Verhalten ist. Erweitern des Namespace std (cppreference.com) :
Es ist ein undefiniertes Verhalten, Deklarationen oder Definitionen zum Namespace std
oder zu einem darin verschachtelten Namespace hinzuzufügen std
, mit einigen unten aufgeführten Ausnahmen
Und swap
wird nicht als eine dieser Ausnahmen bezeichnet. Das Hinzufügen einer eigenen swap
Überladung zum std
Namespace ist daher ein undefiniertes Verhalten.
Es wird auch gesagt, dass die Standardbibliothek einen unqualifizierten Aufruf der swap
Funktion verwendet, um benutzerdefinierte Aufrufe swap
für eine Benutzerklasse aufzurufen, wenn diese benutzerdefiniert swap
bereitgestellt werden.
Austauschbar (cppreference.com) :
Viele Standardbibliotheksfunktionen (z. B. viele Algorithmen) erwarten, dass ihre Argumente Swappable erfüllen. Dies bedeutet, dass die Standardbibliothek jedes Mal, wenn sie einen Swap durchführt, das Äquivalent von verwendet using std::swap; swap(t, u);
.
Swap (www.cplusplus.com) :
Viele Komponenten der Standardbibliothek (innerhalb std
) -Aufruf swap
in einer unqualifizierten Weise individuelle Überlastungen für Nicht-Grundtypen zu ermöglichen , anstelle dieser generischen Version aufgerufen werden: Benutzerdefinierte Überlastungen swap
erklärte im gleichen Namensraum wie die Art , für die sie vorgesehen sind , erhalten ausgewählt durch argumentabhängige Suche über diese generische Version.
Beachten Sie jedoch, dass die direkte Verwendung der std::swap
Funktion für eine benutzerdefinierte Klasse die generische Version von std::swap
anstelle der benutzerdefinierten aufruft swap
:
my::object a, b;
std::swap(a, b); // calls std::swap, not my::swap
Es wird daher empfohlen, die swap
Funktion im Benutzercode auf dieselbe Weise aufzurufen wie in der Standardbibliothek:
my::object a, b;
using std::swap;
swap(a, b); // calls my::swap if it is defined, or std::swap if it is not.