In C++ 11, wenn eine Vorverarbeitung Richtlinie von der Form ...Bedingte Aufnahme in C++ 11 mit benutzerdefiniertem Literal?
#if expr
... angetroffen wird, wird expr
als constant-expression
bewertet wie in 16.1 [cpp.cond]
beschrieben.
Dieser nach Makro Ersatz auf expr
gemacht wird, seine Kennungen (und Schlüsselwörter) durch 0 ersetzt werden, werden ihre preprocessing-tokens
zu tokens
, umgewandelt defined
Operator ausgewertet wird, und so weiter.
Meine Frage ist, was passiert, wenn einer der Token in expr
ein user-defined-literal
ist?
Benutzerdefinierte Literale sind wie Funktionsaufrufe, aber Funktionsaufrufe können nicht auftreten in expr
(glaube ich), als Nebeneffekt der Identifier Ersetzung. Jedoch technisch user-defined-literals
könnte überleben.
Ich vermute, dass es ein Fehler ist, aber ich kann nicht ganz sehen, wie man das vom Standard schließt?
Vielleicht wurde die (pedantische) Auswirkung des Hinzufügens von benutzerdefinierten Literalen auf Klausel 16 [cpp]
einfach ignoriert?
Oder fehlt mir etwas?
Update:
durch ein Beispiel zu verdeutlichen:
Was bedeutet das Vorprozess an:
#if 123_foo + 5.5 > 100
bar
#else
baz
#endif
bar oder baz oder ist es ein Fehler?
GCC 4.7 Berichte:
test.cpp:1:5: error: user-defined literal in preprocessor expression
so denkt, dass es es ein Fehler ist. Kann dies mit Bezug auf den Standard begründet werden? Oder ist das nur "implizit"?
Die Vorstellung des Präprozessors von "konstantem Ausdruck" ist ganz anders als die von C++, glaube ich. Sie können wirklich nur Literale und Makros verwenden, die schließlich zu Literalen expandieren ... zumindest habe ich das immer verstanden. –
Sieht so aus, als ob deine Version von g ++ etwas vermisst, nicht du. –
Ich bezweifle, dass es die Absicht des Komitees war, so etwas zuzulassen, da die Logik der Vorverarbeitung und der Sprachsemantik schon immer so getrennt waren. Aber ja, der Standard scheint zu implizieren, dass er behandelt werden sollte. – aschepler