3

この標準には、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です。

4

1 に答える 1

0

このプログラムは 2.14.3/2 に従って形式が正しくありません。つまり、エラーを診断する必要があります。実装はコンパイルを完了したり、実行可能ファイルを生成したりする必要がないため、さらに分析する必要はありません。リテラルはまだ値を持っていると見なされるかもしれませんが、それはほとんど問題ではありません。

(ただし、実装は不正なプログラムをコンパイルして実行することが許可されています。したがって、その場合、文字リテラルがまだ値を持つように指定されているという事実が問題になると思います。)

于 2012-11-25T20:09:11.087 に答える