この標準には、char16_t
で表すことができない文字を含むリテラルに対して2つの異なる応答があるようchar16_t
です。まず、コードポイント値を16ビットで表すことができない場合(つまり、基本的な多言語平面(BMP)にない場合)、プログラムの形式が正しくありません(§2.14.3/ 2)。
char16_t
単一のc-charを含むリテラルの値は、コードポイントが単一の16ビットコードユニットで表現可能である場合、そのISO10646コードポイント値と等しくなります。(つまり、基本的な多言語プレーンコードポイントである場合。)値が16ビット以内で表現できない場合、プログラムの形式は正しくありません。
\U0001ABCD
は単一のc-char1ですが、BMPには含まれていないため、それを含むプログラムの形式が正しくありません。
わかりましたが、同じ章の後半で、値が実装定義の範囲外にある場合char16_t
、リテラルは実装定義の値(§2.14.3/ 4)を持っていると述べています。
char16_t
文字リテラルの値は、[...] ('<code> u'で始まるリテラルの場合)[... ]に対して定義された実装定義の範囲外にある場合、実装定義です。
の実装定義範囲はchar16_t
(BMP全体を格納できるように)少なくとも16ビットである必要があるため、その範囲外の値に対してプログラムの形式が正しくないことはすでにわかっています。なぜ標準は実装定義の値をわざわざ与えるのですか?
1プロダクションルールはc-char- > universal-character- name- > \U
hex- quadhex-quadです。