最終更新日時: 2025年04月04日 16時20分26秒 (JST)
Akira Takahashi が更新

履歴 編集

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

## 関連項目

- C++26 文字列リテラルの文字エンコーディング失敗を不適格とする

## 参照

- P2362R3 Remove non-encodable wide character literals and multicharacter wide character literals