Auf den ersten Blick scheint es sich um einfachen syntaktischen Zucker zu handeln.
Bei genauerer Betrachtung sehen wir jedoch, dass dies mehr als nur syntaktischer Zucker ist, da es die Optionen des C ++ - Benutzers erweitert, um benutzerdefinierte Typen zu erstellen, die sich genau wie verschiedene integrierte Typen verhalten.In dieser Hinsicht ist dieser kleine "Bonus" eine sehr interessante C ++ 11-Ergänzung zu C ++.
Brauchen wir es wirklich in C ++?
Ich sehe nur wenige Verwendungen in dem Code, den ich in den letzten Jahren geschrieben habe, aber nur weil ich ihn nicht in C ++ verwendet habe, heißt das nicht, dass er für einen anderen C ++ - Entwickler nicht interessant ist .
Wir hatten in C ++ (und in C, denke ich) vom Compiler definierte Literale verwendet, um Ganzzahlen als kurze oder lange Ganzzahlen, reelle Zahlen als float oder double (oder sogar long double) und Zeichenfolgen als normale oder breite Zeichen einzugeben .
In C ++ hatten wir die Möglichkeit, eigene Typen (dh Klassen) zu erstellen , möglicherweise ohne Overhead (Inlining usw.). Wir hatten die Möglichkeit, Operatoren zu ihren Typen hinzuzufügen, damit sie sich wie ähnliche integrierte Typen verhalten, wodurch C ++ - Entwickler Matrizen und komplexe Zahlen so natürlich verwenden können, wie dies der Fall wäre, wenn diese der Sprache selbst hinzugefügt worden wären. Wir können sogar Cast-Operatoren hinzufügen (was normalerweise eine schlechte Idee ist, aber manchmal ist es genau die richtige Lösung).
Wir haben immer noch eine Sache übersehen, bei der sich Benutzertypen als integrierte Typen verhalten: benutzerdefinierte Literale.
Ich denke, es ist eine natürliche Entwicklung für die Sprache, aber um so vollständig wie möglich zu sein: " Wenn Sie einen Typ erstellen möchten und möchten, dass er sich so gut wie möglich wie ein eingebauter Typ verhält, sind hier die Werkzeuge. .. "
Ich würde vermuten, dass es der Entscheidung von .NET sehr ähnlich ist, jedes Grundelement zu einer Struktur zu machen, einschließlich Boolescher Werte, Ganzzahlen usw., und alle Strukturen von Object abzuleiten. Diese Entscheidung allein macht .NET bei der Arbeit mit Grundelementen für Java weit unerreichbar, unabhängig davon, wie viel Boxing / Unboxing-Hacks Java zu seiner Spezifikation hinzufügt.
Brauchen SIE es wirklich in C ++?
Diese Frage müssen SIE beantworten. Nicht Bjarne Stroustrup. Nicht Herb Sutter. Nicht irgendein Mitglied des C ++ - Standardkomitees. Aus diesem Grund haben Sie in C ++ die Wahl , und eine nützliche Notation wird nicht nur auf integrierte Typen beschränkt.
Wenn Sie es brauchen, dann ist es eine willkommene Ergänzung. Wenn Sie dies nicht tun, verwenden Sie es nicht. Es wird dich nichts kosten.
Willkommen bei C ++, der Sprache, in der Funktionen optional sind.
Aufgebläht??? Zeig mir deine Komplexe !!!
Es gibt einen Unterschied zwischen aufgebläht und komplex (Wortspiel beabsichtigt).
Wie von Niels unter gezeigt. Welche neuen Funktionen fügen benutzerdefinierte Literale C ++ hinzu? Die Fähigkeit, eine komplexe Zahl zu schreiben, ist eine der beiden Funktionen, die C und C ++ "kürzlich" hinzugefügt wurden:
// C89:
MyComplex z1 = { 1, 2 } ;
// C99: You'll note I is a macro, which can lead
// to very interesting situations...
double complex z1 = 1 + 2*I;
// C++:
std::complex<double> z1(1, 2) ;
// C++11: You'll note that "i" won't ever bother
// you elsewhere
std::complex<double> z1 = 1 + 2_i ;
Jetzt können sowohl der Typ C99 "double complex" als auch der Typ C ++ "std :: complex" mithilfe der Operatorüberladung multipliziert, addiert, subtrahiert usw. werden.
In C99 wurde jedoch nur ein weiterer Typ als integrierter Typ und eine integrierte Unterstützung für das Überladen von Operatoren hinzugefügt. Und sie haben eine weitere integrierte wörtliche Funktion hinzugefügt.
In C ++ verwendeten sie nur vorhandene Funktionen der Sprache, erkannten, dass die wörtliche Funktion eine natürliche Weiterentwicklung der Sprache war, und fügten sie daher hinzu.
Wenn Sie in C dieselbe Notationsverbesserung für einen anderen Typ benötigen, haben Sie bis zu Ihrer Lobbyarbeit kein Glück, Ihre Quantenwellenfunktionen (oder 3D-Punkte oder einen anderen Basistyp, den Sie in Ihrem Arbeitsbereich verwenden) zum hinzuzufügen C-Standard als eingebauter Typ ist erfolgreich.
In C ++ 11 können Sie dies einfach selbst tun:
Point p = 25_x + 13_y + 3_z ; // 3D point
Ist es aufgebläht? Nein , die Notwendigkeit besteht darin, wie sowohl C- als auch C ++ - Komplexe eine Möglichkeit benötigen, ihre wörtlichen komplexen Werte darzustellen.
Ist es falsch gestaltet? Nein , es wurde wie jede andere C ++ - Funktion entwickelt, wobei die Erweiterbarkeit berücksichtigt wurde.
Ist es nur für Notationszwecke? Nein , da dies Ihrem Code sogar Typensicherheit verleihen kann.
Stellen wir uns zum Beispiel einen CSS-orientierten Code vor:
css::Font::Size p0 = 12_pt ; // Ok
css::Font::Size p1 = 50_percent ; // Ok
css::Font::Size p2 = 15_px ; // Ok
css::Font::Size p3 = 10_em ; // Ok
css::Font::Size p4 = 15 ; // ERROR : Won't compile !
Es ist dann sehr einfach, eine starke Typisierung für die Zuweisung von Werten zu erzwingen.
Ist das gefährlich?
Gute Frage. Können diese Funktionen mit einem Namespace versehen werden? Wenn ja, dann Jackpot!
Wie alles können Sie sich auch umbringen, wenn ein Werkzeug nicht ordnungsgemäß verwendet wird . C ist mächtig und Sie können sich den Kopf abschießen, wenn Sie die C-Waffe missbrauchen. C ++ hat die C-Pistole, aber auch das Skalpell, den Taser und jedes andere Werkzeug, das Sie im Toolkit finden. Sie können das Skalpell missbrauchen und sich verbluten. Oder Sie können sehr eleganten und robusten Code erstellen.
Brauchen Sie es also wie jedes C ++ - Feature wirklich? Diese Frage müssen Sie beantworten, bevor Sie sie in C ++ verwenden können. Wenn Sie dies nicht tun, kostet es Sie nichts. Aber wenn Sie es zumindest wirklich brauchen, wird Sie die Sprache nicht im Stich lassen.
Das Datumsbeispiel?
Ihr Fehler scheint mir zu sein, dass Sie Operatoren mischen:
1974/01/06AD
^ ^ ^
Dies kann nicht vermieden werden, da der Compiler als Operator diesen interpretieren muss. Und AFAIK, es ist eine gute Sache.
Um eine Lösung für Ihr Problem zu finden, würde ich das Literal auf andere Weise schreiben. Beispielsweise:
"1974-01-06"_AD ; // ISO-like notation
"06/01/1974"_AD ; // french-date-like notation
"jan 06 1974"_AD ; // US-date-like notation
19740106_AD ; // integer-date-like notation
Persönlich würde ich die Ganzzahl und die ISO-Daten wählen, aber es hängt von IHREN Bedürfnissen ab. Das ist der springende Punkt, um den Benutzer seine eigenen Literalnamen definieren zu lassen.