2008-12-09

C++0xにおけるユニバーサルキャラクタ名(universal character name)について

以下のコードはC++03では規格違反だが、C++0xでは問題の無いコードである。

"改行コード→\u000D\u000A"

見ての通り、ユニバーサルキャラクタ名で、0x0Dと0x0A、すなわち、CRLFを記述しており、これはWindows環境で標準の改行コードである。これはC++03ではコンパイルできない。何故ならば、2.2 Character setsのパラグラフ2には、以下のように書かれているからである。

If the hexadecimal value for a universal character name is less than 0x20 or in the range 0x7F-0x9F (inclusive), or if the universal character name designates a character in the basic source character set, then the program is ill-formed.

もし、ユニバーサルキャラクタ名の16進数の値が、0x20以下か、0x7F-0x9Fの範囲であるか、あるいはuniversal character nameがbasic source character setであれば、プログラムはill-formedである。

basic source character setという、アルファベット数字記号といくつかのコントロール文字で構成される、96文字の文字である。C++0xでは、この部分は以下のように変更される。

If the hexadecimal value for a universal-character-name corresponds to a surrogate code point (in the range 0xD800–0xDFFF, inclusive), the program is ill-formed. Additionally, if the hexadecimal value for a universal-character-name outside a character or string literal corresponds to a control character (in either of the ranges 0x00–0x1F or 0x7F–0x9F, both inclusive) or to a character in the basic source character set, the program is ill-formed.

もし、ユニバーサルキャラクタ名の16進数の値が、サロゲートコードポイント(0xD800-0xDFFFの範囲)にあたる場合は、プログラムはill-formedである。さらに、もし、文字と文字列リテラル以外のユニバーサルキャラクタ名の16進数の値が、コントロール文字(0x00-0x1Fか、0x7F-0x9Fの範囲であるとき)か、basic source character setである場合は、プログラムはill-formedである。

この英文は理解しづらいと思う。"outside a character or string literal"というのは、「文字と文字列リテラルの外で」という意味だ。つまり文字と文字列リテラルはこの制限を受けない。

コンパイラが良きに計らってくれるのでは困る。俺はサロゲートペアを直接使いたいんだという人は知らん。

No comments: