Nutzung von using namespace std;
-
@Jockelx sagte in Nutzung von using namespace std;:
Mmh, verstehe ich nicht. Es geht doch darum die Spezialisierung zu finden. Wird diese nicht gefunden, wird "normal" geswappt. Warum sollte das UB sein, selbst wenn es O(n^99) wäre?
Wenn man immer
std::swap
schreibt, wird die Spezialisierung nicht gefunden undstd::swap
genutzt.std::swap
hat aber das Problem, dass es einige zusätzliche Annahmen macht, die seit C++11 nicht mehr generell erfüllt sind. Ich habe einen eigenen Beitrag dazu eingefügt, damit dürfte nachvollziehbar sein was ich meine.
-
Danke für den Tipp auch!
-
@john-0 sagte in Nutzung von using namespace std;
Wenn man immer
std::swap
schreibt, wird die Spezialisierung nicht gefunden undstd::swap
genutzt.std::swap
hat aber das Problem, dass es einige zusätzliche Annahmen macht, die seit C++11 nicht mehr generell erfüllt sind. Ich habe einen eigenen Beitrag dazu eingefügt, damit dürfte nachvollziehbar sein was ich meine.Nicht, wenn man seine Spezialisierung im Namespace
std
implementiert:struct MyStruct { }; namespace std { template<> void swap( MyStruct& lhs, MyStruct& rhs ) { ... } }
-
@DocShoe sagte in Nutzung von using namespace std;:
Nicht, wenn man seine Spezialisierung im Namespace
std
implementiert:Aua, das ist ein absolutes No-go.
-
@john-0
Nö, das ist vom Kommittee sogar explizit erlaubt worden. Man spezialisiert seine swap Funktion im std-namespace. Man muss seine swap-Funktion aber als Spezialisierung implementieren, nicht als Überladung. Bis C++20 jedenfalls.Edit:
Referenz siehe Box "Specializations"
-
@DocShoe sagte in Nutzung von using namespace std;:
@john-0
Nö, das ist vom Kommittee sogar explizit erlaubt worden. Man spezialisiert seine swap Funktion im std-namespace. Man muss seine swap-Funktion aber als Spezialisierung implementieren, nicht als Überladung. Bis C++20 jedenfalls.Ok, wieder was gelernt. Wobei ich mich nicht ganz falsch erinnere, denn da steht ja.
std::swap may be specialized in namespace std for program-defined types, but such specializations are not found by ADL (the namespace std is not the associated namespace for the program-defined type).
D.h. es ist zwar möglich bis C++20 ist es aber nicht sinnvoll, weil es ggf. nicht gefunden wird.
-
Im Gegensatz zur hier oft apodiktisch vertretenen Meinung, dass ein globales
using namespace std;
universell schwachsinnig ist und nur von Anfängern und Juergen Wolf eingesetzt wird, habe ich in professionellem Umfeld zu schätzen gelernt, dass selbst in riesigen Projektenstd
in zentralen Headern geöffnet wird. Es ist in der Praxis wirklich einfach unproblematisch. Ich würde es definitiv nicht in einer Bibliothek machen, da man ja nicht seine Idiome auf den User zwingen will, aber in einem eigenen Projekt ist es kein Thema.
-
@Columbo sagte in Nutzung von using namespace std;:
Im Gegensatz zur hier oft apodiktisch vertretenen Meinung, dass ein globales
using namespace std;
universell schwachsinnig ist und nur von Anfängern und Juergen Wolf eingesetzt wird, habe ich in professionellem Umfeld zu schätzen gelernt, dass selbst in riesigen Projektenstd
in zentralen Headern geöffnet wird. Es ist in der Praxis wirklich einfach unproblematisch. Ich würde es definitiv nicht in einer Bibliothek machen, da man ja nicht seine Idiome auf den User zwingen will, aber in einem eigenen Projekt ist es kein Thema.Tja nö, es ist eben nicht generell unproblematisch. Bekanntestes Beispiel: max unter Windows.
-
Ich mache es nie global, aber durchaus lokal, wenn ich in einer Methode häufiger Dinge aus einem anderen Namespace verwende. Nicht unbedingt mit std, weil es nicht soviel tipparbeit ist, aber wenn die namespaces länger sind, nehme ich gern mal using namespace.
-
@Tyrdal sagte in Nutzung von using namespace std;:
@Columbo sagte in Nutzung von using namespace std;:
Im Gegensatz zur hier oft apodiktisch vertretenen Meinung, dass ein globales
using namespace std;
universell schwachsinnig ist und nur von Anfängern und Juergen Wolf eingesetzt wird, habe ich in professionellem Umfeld zu schätzen gelernt, dass selbst in riesigen Projektenstd
in zentralen Headern geöffnet wird. Es ist in der Praxis wirklich einfach unproblematisch. Ich würde es definitiv nicht in einer Bibliothek machen, da man ja nicht seine Idiome auf den User zwingen will, aber in einem eigenen Projekt ist es kein Thema.Tja nö, es ist eben nicht generell unproblematisch. Bekanntestes Beispiel: max unter Windows.
Ich verstehe gar nicht, was Dein Argument sein soll.
std::max
wird gerade nicht funktionieren weilmax
ein Makro ist.NOMINMAX
ist quasi obligatorisch. Haetten sie max als Funktion deklariert, dann wäreusing namespace std;
kein Problem, weil die STL Version als Funktionstemplate per overload resolution korrekt differenziert werden wuerde.
-
@Columbo
Naja das Problem ist...
Mitusing namespace std;
funktioniertmax()
. Wenn man dann zusätzlichWindows.h
ohneNOMINMAX
reinholt ... dann funktioniert das in den meisten Fällen immer noch. Nur nicht gleich, weil dann das zurückgegebene Argument mehrmals ausgewertet wird. Und der Typ des Ausdrucks ist denke ich auch anders.Ohne
using namespace std;
muss manstd::max
schreiben. Und da bekommt man mitWindows.h
(ohneNOMINMAX
) dann wenigstens einen Fehler beim kompilieren.
-
@hustbaer Ich habe postuliert "Namespaces ausschütten ist böse in Libs, aber ok in eigenen Projekten".
WinAPI schiesst voll daneben indem es Makros mit extrem simplen und oft verwendeten Namen definiert. Das ist doof, und die wichtigste Schlussfolgerung ist, dass der Entwickler unbedingt
NOMINMAX
definieren muss—using namespace
hin oder her,min
/max
als Makros ist purer Zirkus.using namespace std;
ist da nebensächlich.
-
@Columbo
Bezüglichusing namespace std;
in eigenen (non-Library) Projekten... also "OK" ist es schon, ich würde es aber nicht unbedingt haben wollen. Kommt wahrscheinlich drauf an was man gewohnt ist und auch wie man seine lokalen Bezeichner benennt.Was den Rest angeht: Klar, sehe ich auch so. Ich wollte nur erklären wie
using namespace std;
in Kombination mitWindows.h
zu einem Problem führen kann.
-
Abgesehen von den Problemen mit using namespace, finde ich es subjektiv mittlerweile tatsächlich besser, wenn z.B. std::string oder std::vector dransteht, und nicht einfach nur string oder vector. Das ist irgendwie viel griffiger und eindeutiger.
-
Geht mir genau so. Wobei ich das nie anders kannte und mir daher auch vorstellen kann dass man sich auch an einfach nur
string
undvector
gewöhnen kann.