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

履歴 編集

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

概要

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進数ではない文字が現れることでエスケープシーケンスの範囲が終了するため注意が必要であった。

関連項目

参照