Es scheint, dass (2) ( freistehend swapim selben Namespace, in dem die benutzerdefinierte Klasse deklariert ist ) die einzige zulässige Möglichkeit ist, swapeine benutzerdefinierte Klasse bereitzustellen , da das Hinzufügen von Deklarationen zum Namespace stdim Allgemeinen ein undefiniertes Verhalten ist. Erweitern des Namespace std (cppreference.com) :
Es ist ein undefiniertes Verhalten, Deklarationen oder Definitionen zum Namespace stdoder zu einem darin verschachtelten Namespace hinzuzufügen std, mit einigen unten aufgeführten Ausnahmen
Und swapwird nicht als eine dieser Ausnahmen bezeichnet. Das Hinzufügen einer eigenen swapÜberladung zum stdNamespace ist daher ein undefiniertes Verhalten.
Es wird auch gesagt, dass die Standardbibliothek einen unqualifizierten Aufruf der swapFunktion verwendet, um benutzerdefinierte Aufrufe swapfür eine Benutzerklasse aufzurufen, wenn diese benutzerdefiniert swapbereitgestellt 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 swapin einer unqualifizierten Weise individuelle Überlastungen für Nicht-Grundtypen zu ermöglichen , anstelle dieser generischen Version aufgerufen werden: Benutzerdefinierte Überlastungen swaperklä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::swapFunktion für eine benutzerdefinierte Klasse die generische Version von std::swapanstelle der benutzerdefinierten aufruft swap:
my::object a, b;
std::swap(a, b); // calls std::swap, not my::swap
Es wird daher empfohlen, die swapFunktion 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.