In der C++ - Community wird empfohlen, using namespace std;
nicht zu verwenden. Angenommen, Sie möchten String-Literale verwenden, z. auto s = "dummy"s;
. Nicht mit using namespace std;
Ursache für fehlgeschlagene Kompilierung. Was ist die Lösung?Verwenden von Zeichenfolgenliteralen ohne Verwendung von Namespace std
Antwort
operator""s
ist in 2 inline Namensräume in Namespace std
. Es sieht im Wesentlichen wie folgt:
namespace std
{
inline namespace literals
{
inline namespace string_literals
{
//operator""s implementation
//...
}
}
}
Also, um nur die Zeichenketten zu erhalten, verwenden using namespace std::string_literals;
.
Alternatevely, wenn Sie jeder wörtlichen enthalten sein sollen - einschließlich der Stringliterale (wie s
für Sekunden, wenn Sie chrono
umfassen, ...): using namespace std::literals;
.
Je nach Situation könnten Sie auch mit berücksichtigen:
using std::string_literals::operator""s;
statt jeden Namen aus diesem Namensraum zu importieren.
Beachten Sie, dass Sie sollten immer noch nicht in einem Header enthalten, auf globaler Ebene (aber man kann es in Inline- oder Elementfunktionen oder Namespace tun Sie steuern)
Warum konnten wir nicht etwas wie 'using std :: string_literals :: s;' verwenden? –
@ E.Vakili Ich denke, Sie können 'using std :: string_literals :: operator" "s;' – Rakete1111
@ E.Vakili Das klingt wie eine gute Idee. Leider gibt 'GCC v6.1.1' mir eine Warnung, wenn ich das tue, scheint es, als ob ich versuche, mein eigenes String-Literal mit einem ungültigen Namen zu definieren. – Galik
Für Stringliterale können Sie:
using namespace std::string_literals;
Das wird etwa 4
Namen in den Namespace ziehen, die in Ordnung ist. Aber wenn Sie das tun:
using namespace std;
Dann ziehen Sie in Tausenden von Namen, von denen viele häufig in Programmen verwendet werden wie count
und time
. Dies kann zu schwer zu findenden Fehlern führen, wenn man sich versehentlich auf das Falsche bezieht.
Das ist kein Problem mit den Zeichenfolgenliteralen.
Auch keiner der Namen, die using namespace std::string_literals;
bringen sollte mit benutzerdefinierten Namen stören, weil benutzerdefinierter Stringliterale muss mit _
beginnen (nach der Norm), die Konflikte vermeidet.
Allerdings sollten Sie noch using namespace std::string_literals;
im globalen Namespace einer Header-Datei vermeiden, da Sie keinem Benutzer ein Feature auferlegen sollten, das sie nicht anfordern.
Dies sollte jedoch nicht im Namensraumbereich in einer Kopfzeile verwendet werden. – Brian
Die obigen Operatoren sind in der namespace std::literals::string_literals
deklariert, wobei sowohl Literale als auch Zeichenfolgenliterale Inline-Namespaces sind. Der Zugang zu diesen Operatoren kann mit der Verwendung von Namespace std :: Literale gewonnen werden, using namespace std::string_literals
und using namespace std::literals::string_literals
- 1. "Namespace Std {}" vor "Namespace Std verwenden;"
- 2. unsachgemäße Verwendung von std-Namespace-Overhead
- 3. Verwendung von Suffixen ohne Std :: Literale
- 4. Kompilierung von Zeichenfolgenliteralen
- 5. Warum unterscheidet sich das Makro bei Verwendung von Namespace std und Namespace std nicht?
- 6. Verwendung von/Typedef von Namespace in Header
- 7. "Verwendung von unbekannten Namespace" beim Hinzufügen von benutzerdefinierten Namespace
- 8. C++ - Namespace: Verwenden ohne Eigentümer
- 9. Hinzufügen von Typen zum std-Namespace
- 10. NoReverseMatch bei der Verwendung von Apphook ohne Namespace
- 11. Verwendung von std :: shared_ptr
- 12. Namespace verwenden mehr Definition von
- 13. Was ist der Zweck von: "Namespace verwenden"?
- 14. Verwendung von Namespace und Verwendung der Direktive funktioniert nicht für std :: enable_if_t
- 15. Verwendung von keinem Namespace im Xpath-Ausdruck
- 16. Empfohlene Verwendung von std :: unique_ptr
- 17. Escaping von JavaScript-Zeichenfolgenliteralen in Ansichten
- 18. Wie die Verwendung von std :: bind mit std kombinieren :: shared_ptr
- 19. Verwendung von std :: deque und Klirren Compiler
- 20. namespace std Überlastung weniger als
- 21. Vorteile der Verwendung von Std :: Funktion
- 22. Unterschied in using namespace (std :: vs :: std: :)
- 23. Problem mit der Verwendung von Std :: Kopieren
- 24. Warum ist es obligatorisch, Namespace std in C++ zu verwenden?
- 25. Verwendung von SQLite mit std :: iostream
- 26. Verwenden von Karte von Std-Bibliothek
- 27. unter Verwendung von Standard-Namespace in C plus plus
- 28. Verwendung von std :: vector in CUDA Gerätecode
- 29. Seltsam Verwendung von std :: map Konstruktor
- 30. Methode Verkettung von Namespace
Die Lösung könnte sein, als Referenz Informationen zu suchen, bevor er fragt, auf Websites wie cppreference, deren [Dokumentation 'operator" "s' zeigt genau das, was Sie wollen] (http://en.cppreference.com/w/cpp/string/basic_string/operator%22%22s) –
Sind die nicht übereinstimmenden Anführungszeichen in dieser Frage ein Tippfehler oder etwas Unklares? Feature? – plugwash
@ plugwash, es ist nicht obskur, es ist neu. Der Kommentar über Ihrem wird es für diejenigen erklären, die die Frage nicht verstehen. –