2016-08-15 3 views
20

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

+2

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) –

+1

Sind die nicht übereinstimmenden Anführungszeichen in dieser Frage ein Tippfehler oder etwas Unklares? Feature? – plugwash

+0

@ plugwash, es ist nicht obskur, es ist neu. Der Kommentar über Ihrem wird es für diejenigen erklären, die die Frage nicht verstehen. –

Antwort

24

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)

+2

Warum konnten wir nicht etwas wie 'using std :: string_literals :: s;' verwenden? –

+3

@ E.Vakili Ich denke, Sie können 'using std :: string_literals :: operator" "s;' – Rakete1111

+0

@ 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

8

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.

+1

Dies sollte jedoch nicht im Namensraumbereich in einer Kopfzeile verwendet werden. – Brian

3

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

Quelle: std::literals::string_literals::operator""s

Verwandte Themen