In C ++ 11 erhalten wir benutzerdefinierte Literale. Der C ++ - Standard enthält Beispiele für diese Beispiele:
%Vor%Und es sagt, das Literal sollte mit einem Unterstrich beginnen:
17.6.4.3.5 Benutzerdefinierte literale Lösungen
Literale Kennungen, die nicht mit einem Unterstrich beginnen, sind für die zukünftige Standardisierung reserviert.
Es gibt jedoch einen anderen Abschnitt im Standard, der sagt
17.6.4.3.2 Globale Namen
Bestimmte Gruppen von Namen und Funktionssignaturen sind immer für die Implementierung reserviert:
- Jeder Name, der einen doppelten Unterstrich _ _ enthält oder mit einem Unterstrich beginnt, gefolgt von einem Großbuchstaben (2.12), ist für jede Verwendung reserviert.
- Jeder Name, der mit einem Unterstrich beginnt, ist für die Implementierung als Name im globalen Namespace reserviert.
Ich möchte besser verstehen, was genau 17.6.4.3.2 (Globale Namen) sagt / bedeutet und wie es sich auf 17.6.4.3.5 (Benutzerdefinierte Literale) bezieht. Speziell:
_w
) in einem Namespace definiert werden (dh nicht im globalen Namespace)? Wenn dem so wäre, würde ich mir wünschen, dass der Standard dies veranschaulicht. _W
(gefolgt von Großbuchstaben) und __w
und _w__
(zwei aufeinanderfolgende Unterstriche) ausschließt. Korrekt? Bearbeiten:
Als Follow-up gibt es einen Teil des Standards, der sagt:
13.5.8 Benutzerdefinierte Literale
[...]
2 Eine Deklaration, deren deklarator-id eine literal-operator-id ist, soll eine Deklaration einer Namespace-Scope-Funktion oder -Funktionsvorlage sein (es könnte eine Friend-Funktion sein (11.3)) , eine explizite Instanziierung oder Spezialisierung einer Funktionsvorlage oder einer using-Deklaration (7.3.3). Eine mit einer Literal-Operator-ID deklarierte Funktion ist ein Literaloperator. Eine Funktionsvorlage, die mit einer Literaloperator-ID deklariert wird, ist eine literale Operatorvorlage.
Schwerpunkt meiner. Wenn "namespace-scope" heißt, bedeutet dies, dass benutzerdefinierte Literale in einem benutzerdefinierten Namespace (d. H. Nicht im globalen Namespace) deklariert werden müssen?
Spätere Bearbeitung:
Es war nicht vorhanden, als die Frage zuerst gestellt wurde, aber jetzt gibt es auch diese Frage und Antwort , die Leser können zusätzlich nach der Überprüfung der Antworten überprüfen.
Was ist in einem Namen? 3 Grundlegende Konzepte [grundlegend] sagt uns:
4 Ein Name ist eine Verwendung eines Bezeichners (2.11), einer Operator-Function-ID (13.5), einer Literal-Operator-ID (13.5.8), einer Conversion-Function-ID (12.3.2) oder eines Template- id (14.2), die eine Entität oder ein Label (6.6.4, 6.1) bezeichnet.
was wir mit 13.5.8 Benutzerdefinierte Literale [over.literal] referenzieren:
Literaloperator-ID :
operator ""
identifier
Während der Name eines Literaloperators einen Bezeichner enthält, bezeichnet dieser Bezeichner keine Entität. (Oder es ist ein anderer Bezeichner und ein anderer Name, der insgesamt eine andere Entität oder ein anderes Label bezeichnet.) Daher beginnt der Name eines literalen Operators niemals mit einem Unterstrich.
Etwas wie operator""__w
ist problematisch, aber das ist nicht neu: int i__0;
ist ebenfalls reserviert.