2014-02-26 10 views
10

Eine kurze Frage: warum für wörtliche definiert C nicht ++ 11 bietet eine "benutzer" (wirklich, Standardbibliothek), die beide ein std::string, wieWarum kein standarddefiniertes Literalsuffix für std :: string?

auto str = "hello world"s; // str is a std::string 

wie C++, Objective-C zu schaffen unterstützt C-Style-Strings und ein benutzerfreundlicherer Bibliothekstyp NSString; Im Gegensatz zu C++ wird jedoch niemand zwischen den beiden verwechselt, da es einfach ist, NSString zu erstellen, indem ein Zeichenfolgenliteral mit @ vorangestellt wird. In der Tat ist es selten, Objective-C-Code zu sehen, wo ein Literal nicht das Präfix @ hat. Jeder weiß genau, dass es so ist, benutzt NSString und macht damit weiter.

C++ 11 benutzerdefinierte Literale würde dies erlauben, und in der Tat verwendet die UDL-Abschnitt auf Stroustrup C++ 11 FAQ genau dieses Beispiel. Darüber hinaus sind UDLs ohne führenden Unterstrich reserviert, so dass es kein Problem wäre, eine einfache s wie oben zuzulassen - es gibt keine Möglichkeit, dass sie mit etwas anderem kollidiert.

Vielleicht vermisse ich etwas, aber es scheint, dass dies eine sehr wertvolle und risikolose Ergänzung zur Sprache wäre, weiß also jemand, warum C++ 11 es nicht anbietet? Wird es wahrscheinlich in C++ 14 angezeigt?

Antwort

19

Benutzerdefinierte Literale waren neu genug in C++ 11, dass dies nicht enthalten war, aber es ist in C++ 14 (in §21.7, falls jemand interessiert ist). Und ja, es verwendet s als Suffix. Der genaue Ergebnistyp hängt vom Typ des Zeichenfolgenliterals selbst ab - ein "schmales" Literal gibt std::string, ein u16-Literal ergibt u16string, und ein u32-Literal ergibt u32string. Oh, und ja, wenn Sie darauf bestehen, ein breites String-Literal zu verwenden, wird es eineproduzieren.

Beachten Sie, dass die s Suffix auch bedeuten Sekunden verwendet wird (definiert in <chrono>), aber es gibt keinen wirklichen Konflikt zwischen dem two-- s auf einem Stringliteral bedeutet eine Zeichenfolge, und s auf einer Zahl bedeutet Sekunden.

+2

Nun, wir gehen, eine perfekte Antwort in ein paar Sekunden, +1 (oder mehr, wenn ich könnte). Seltsam, dass es nicht Teil des ursprünglichen UDL-Vorschlags war, aber da gehen wir hin. Ich freue mich darauf, endlich (hoffentlich) den Fluch von 'char *' in C++ 14 zu verlieren! –

+0

würde ich gerne verwenden, vor allem in Kombination mit "auto" – Excelcius

+2

@Excelcius: Wichtiger als mit 'auto' (mindestens IMO) ist einfach in Ausdrücke, wie das Hinzufügen von Strings zusammen:' "A" s + "B" s zum Beispiel. –