5
ユーザー定義リテラルのすべての「通常の」使用は未定義の動作ですか?
ユーザー定義のリテラルはアンダースコアで始める必要があります。 これは多かれ少なかれ一般的によく知られているルールであり、ユーザーのリテラルについて話しているすべての素人のサイトで見つけることができます。それは私(そしておそらく他の人たち?)が「なんてでたらめな」ベースで以来、露骨に無視してきたルールでもあります。もちろん、これは厳密には正しくありません。厳密に言うと、これは予約済み識別子を使用するため、未定義の動作を呼び出します(実際には、コンパイラから肩をすくめるほどではありません)。 それで、私が標準のその(私の意見では役に立たない)部分を故意に無視し続けるべきかどうかを考えて、私は実際に何が書かれているかを調べることにしました。なぜなら、誰もが知っていることが重要なのです。重要なのは、標準で書かれていることです。 [over.literal]「一部の」リテラル接尾辞識別子は予約されており、にリンクして[usrlit.suffix]いることを示しています。後者は、アンダースコアで始まるものを除いて、すべて予約されていると述べています。わかりました。これは、私たちがすでに知っていて、明示的に書かれた(または逆に書かれた)こととほぼ同じです。 また、明白だが厄介なことを示唆するメモが[over.literal]含まれています。 上記の制約を除いて、それらは通常の名前空間スコープ関数と関数テンプレートです まあ、確かにそうです。彼らがそうではないと言っているところはどこにもないので、あなたは彼らがそうであると他に何を期待するでしょう。 しかし、ちょっと待ってください。グローバル名前空間で[lex.name]アンダースコアで始まる各識別子は予約されていることを明示的に述べています。 現在、リテラル演算子は通常、明示的に名前空間に入れない限り(これはだれもしないと思います!?)、大部分はグローバル名前空間にあります。したがって、名前はアンダースコアで始まる必要があり、予約されています。特別な例外についての言及はありません。したがって、すべての名前(下線あり、またはなし)は予約済みの名前です。 「通常の」使用法(アンダースコアかどうかにかかわらず)が予約名を使用しているため、ユーザー定義のリテラルを名前空間に入れることが本当に期待されていますか?