このページはC++23に採用された言語機能の変更を解説しています。
のちのC++規格でさらに変更される場合があるため関連項目を参照してください。
概要
C++23では、ワイド文字リテラルとして、以下を禁止する:
- マルチキャラクタリテラル
- エンコード可能ではない、または複数文字を含む文字
wchar_t a = L'🤦'; // C++20:OK, C++23:OK \U0001f926
wchar_t b = L'ab'; // C++20:OK, C++23:NG マルチキャラクタリテラル
wchar_t c = L'é'; // C++20:OK, C++23:NG \u0065\u0301
wchar_t
はプラットフォームによって16ビットか32ビットのどちらかとなる。
変数a
のケースはwchar_t
が32ビットの環境では情報を損うことなく表現でき、16ビットの環境では上位16ビットか下位16ビットのどちらかが切り捨てられる実装がある。
a
のケースは32ビットの場合には正しいものであるため、C++23では維持される。
変数b
のケースはマルチキャラクタリテラル (multi-character literals) であり、実装定義の値となるが、多くの環境でいずれか1文字の値のみが使われていた。また、韓国語やバラモン語では1文字に見えて複数文字であるような場合があるため、wchar_t
にマルチキャラクタリテラルを許可することはバグの元であるため、禁止とする。
変数c
のケースは1文字のように見えても複数のコードポイントで構成されており、マルチキャラクタリテラルの一種であるため禁止とする。