最終更新日時: 2026年04月06日 14時09分24秒 (JST)
Akira Takahashi が更新

履歴 編集

# 文字列リテラルの文字エンコーディング失敗を不適格とする [P1854R4](C++26)

このページはC++26に採用される見込みの言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

## 概要

C++23では、以下のような1ワイド文字に収まらないリテラルが不適格 (コンパイルエラー) になるよう仕様変更された。

    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

C++26ではさらに、文字列リテラルとしてエンコーディングできない文字の扱いが実装定義でコンパイラーに任されていたものを、不適格になるよう仕様変更する。

また、マルチ文字リテラル (ひとつの文字リテラルに4文字まで入れられて値が実装定義なもの。例として`'intl'`) については、単一のコードユニットにエンコードされるもののみ許可される。

    char c = 'é'; // C++23:実装定義, C++26:NG グレイブアクセントをつけると複数のコードユニットになる

## 関連項目

- C++23 1ワイド文字に収まらないワイド文字リテラルを禁止する
- C++26 コンパイル時にのみ使用される文字列の扱いを明確化

## 参照

- P1854R4 Making non-encodable string literals ill-formed