最終更新日時(UTC):
が更新

履歴 編集

1ワイド文字に収まらないワイド文字リテラルを禁止する [P2362R3](C++23)

このページは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文字のように見えても複数のコードポイントで構成されており、マルチキャラクタリテラルの一種であるため禁止とする。

参照