2015-02-25 22 views
7

Ich habe gelesen, dass, wenn Sie swap ing Dinge in C++ sind, dann sollten Sie immer using std::swap;, dann swap unqualifizierte nennen, so nimmt es automatisch die std:: diejenigen für std:: und builtin Typen, Ihre individuelle eine für benutzerdefinierte Typen, und die auf Vorlagen std:: eins für alles andere.Ist es in Ordnung, "using std :: swap;" in einem Header?

Also, kann ich einfach setzen using std::swap; in den Header, die jede Datei enthält und sich keine Sorgen machen müssen?

Ich verstehe, dass die Vermeidung von using in einem Header ist gängige Praxis. Gibt es jedoch ein Problem in diesem speziellen Fall?

+0

möglich Duplikat von [using Deklaration in Header-Dateien] (http://stackoverflow.com/questions/22201937/using-declaration-in-header-files) – aruisdante

+4

@aruisdante Nein, ist es nicht. OP fragt nach einer bestimmten Verwendung. – Pradhan

+0

@Pradhan eine bestimmte Verwendung macht nicht den globalen Namespace mit "Verwendung" mehr gültig zu belasten, würde ich denken. – aruisdante

Antwort

7

Die Anleitung für den Austausch ist using std::swapim lokalen Bereich möglich. Sicherlich erfüllt einer in einer Header-Datei, die weit enthalten ist, diese Anforderung nicht. Es immer noch verschmutzt den globalen Namespace auf unerwartete Arten (jemand erwartet nicht std::swap wird in den globalen Namespace importiert werden) und sollte genau wie using namespace vermieden werden.

+0

Welches unerwartete Verhalten könnte ich bekommen? – Dan

0

Das hier Prinzip Problem ist, dass Sie, dass die Menschen ihren eigenen swap s geschrieben hätten davon aus nicht, die besser Matches geschehen sein, die auf die Semantik von std::swap und verwandten Freunden subtil oder ganz andere Dinge zu tun. Betrachten Sie für ein einfaches Beispiel

wo die Inhalte der Zeiger ausgetauscht werden. Versuchen Sie nun, ein Paar int* auszutauschen. Sie könnten denken, dass die Zeiger ausgetauscht werden, aber stattdessen, Überraschung! es sind die Inhalte, die ausgetauscht werden.

Wirklich, ist die Führung für swap das gleiche wie jeder andere- nur using am meisten lokalen Bereich möglich und nicht früher und definitiv nicht in einem Header.

+0

Wenn jemand 'void swap (int * a, int * b);' geschrieben hat und Ihre Funktion 'mit std :: swap; swap (x, y); 'auf zwei Zeigern zu int, dann würden Sie das gleiche Problem bekommen (es findet die bessere Übereinstimmung anstatt' std :: swap' zu verwenden). Ich denke, das Problem hier ist, dass die falsche Swap-Funktion mit allem mischt. –

+0

@MattMcNabb Nein, die nicht qualifizierte Suche wird beendet, sobald der Name im lokalen Bereich gefunden wird. Sie werden den gefälschten Swap nicht abholen. Und es gibt auch keine ADL. –

Verwandte Themen