最終更新日時(UTC): 2025年07月10日 01時26分30秒
Koichi Murase が更新

履歴 編集

# エスケープシーケンスの区切り [P2290R3](C++23)

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

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

## 概要

C++23では、文字列リテラル中に記述するエスケープシーケンスとユニバーサルキャラクタ名の範囲を明確にするための波カッコ (`{}`) で囲む構文が追加される。

    // 8進数のエスケープシーケンス
    "\18";    // 8は8進数に含まれないので'\1'と'8'の2文字を表す
    "\o{1}8"; // C++23 : 上記と等価
    "\o{18}"; // C++23 : コンパイルエラー！

    // 16進数のエスケープシーケンス
    "\xabc";    // 1文字
    "\xab" "c"; // 2文字 (文字列リテラルを分けて連結させる回避策)
    "\x{ab}c";  // C++23 : 2文字を表す

    // ユニバーサルキャラクタ名
    u8"\u0001F1F8"; // 4文字か8文字のみ指定できる制限があるので先頭0埋めする
    u8"\u{1F1F8}";  // C++23 : 5文字のコードポイントも記述できる

8進数エスケープシーケンスには3文字までという制限、ユニバーサルキャラクタ名には4文字または8文字の制限があったが、この構文ではその制限はない。

## この機能が必要になった背景・経緯

### ユニバーサルキャラクタ名の4文字・8文字制限

ユニバーサルキャラクタ名は4文字か8文字で指定する制限があったため、5文字のコードポイントを指定するために`\U0001F1F8`のように先頭を0埋めする必要があった。

### エスケープシーケンスの範囲を表現しにくい問題

8進数または16進数によるエスケープシーケンスは、8進数は3文字まで、16進数は無制限の文字数という制限の違いがあり、また、8進数または16進数ではない文字が現れることでエスケープシーケンスの範囲が終了するため注意が必要であった。

## 関連項目

- C++11 `char16_t`と`char32_t`

## 参照

- P2290R3 Delimited escape sequences