C++11 では、次の形式の前処理ディレクティブが...
#if expr
...が検出され、で説明されているように としてexpr
評価されます。constant-expression
16.1 [cpp.cond]
これは のマクロ置換の後に行われexpr
、その識別子 (およびキーワード) は 0 に置き換えられ、preprocessing-tokens
に変換されtokens
、defined
演算子が評価されます。
私の質問は、トークンの 1 つexpr
がuser-defined-literal
?
expr
ユーザー定義のリテラルは関数呼び出しのようなものですが、識別子置換の副作用として、関数呼び出しは (私が思うに) では発生しません。ただし、技術的user-defined-literals
には生き残ることができます。
エラーだと思いますが、標準からそれを結論付ける方法がよくわかりませんか?
おそらく、第 16 節にユーザー定義リテラルを追加することの (衒学的な) 影響[cpp]
は単に無視されたのでしょうか?
または、何か不足していますか?
アップデート:
例で明確にするには:
この前処理は次のことを行います。
#if 123_foo + 5.5 > 100
bar
#else
baz
#endif
bar または baz またはエラーですか?
GCC 4.7 レポート:
test.cpp:1:5: error: user-defined literal in preprocessor expression
したがって、エラーと見なされます。これは、標準を参照して正当化できますか? それともこれは単に「暗黙的」ですか?