Skip to content

Commit 688d25f

Browse files
committed
C++23 : 「エスケープシーケンスの区切り」を追加 (close #1020)
1 parent 754290d commit 688d25f

File tree

4 files changed

+42
-2
lines changed

4 files changed

+42
-2
lines changed

implementation-status.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@
248248
| 言語機能 | 説明 | [GCC][gcc] | [Clang][clang] | [ICX][icx] | [MSVC][msvc] |
249249
|----------|------|------------|----------------|------------|--------------|
250250
| P0330R8: [(符号付き)`size_t`リテラルのためのサフィックス](/lang/cpp23/literal_suffix_for_signed_size_t.md) | `42z`/`42Z`とすることで`size_t`に対応する符号付き整数型のリテラルとする | 11 | 13 | 2022.2 | - |
251-
| P2290R3: [エスケープシーケンスの区切り](/lang/cpp23/delimited_escape_sequences.md.nolink) | エスケープシーケンスの範囲を明確にする構文を追加する | 13 | 15 | 2023.2 | - |
251+
| P2290R3: [エスケープシーケンスの区切り](/lang/cpp23/delimited_escape_sequences.md) | エスケープシーケンスの範囲を明確にする構文を追加する | 13 | 15 | 2023.2 | - |
252252
| P2266R3: [暗黙的なムーブを簡略化](/lang/cpp23/simpler_implicit_move.md.nolink) | 参照を返す関数の`return`文で暗黙的にムーブされない問題を修正 | 13 | 13 | 2022.2 | - |
253253
| P1787R6: [スコープと名前ルックアップの仕様整理](/lang/cpp23/declarations_and_where_to_find_them.md.nolink) | 複雑で不完全になっているスコープと名前ルックアップの仕様を整理し、一部の問題を解決する | - | - | - | - |
254254
| P2615R1: [無意味なexport宣言を禁止する](/lang/cpp23/meaningful_exports.md.nolink) | | - | - | - | - |

lang/cpp11/char16_32.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ int main()
133133
- [C++20 `char16_t``char32_t`の文字・文字列リテラルを、文字コードUTF-16/32に規定](/lang/cpp20/make_char16t_char32t_string_literals_be_utf16_32.md)
134134
- [ostream `operator<<`](/reference/ostream/basic_ostream/op_ostream_free.md)
135135
- [C++23 名前付きユニバーサルキャラクタ名](/lang/cpp23/named_universal_character_escapes.md)
136+
- [C++23 エスケープシーケンスの区切り](/lang/cpp23/delimited_escape_sequences.md)
136137

137138
## 参照
138139
- [WG14 N1040 Extensions for the programming language C to support new character data types](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1040.pdf)

lang/cpp23.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ C++23とは、2023年中に改訂される予定の、C++バージョンの通
1212
| 言語機能 | 説明 |
1313
|----------|------|
1414
| [(符号付き)`size_t`リテラルのためのサフィックス](cpp23/literal_suffix_for_signed_size_t.md) | `42z`/`42Z`とすることで`size_t`に対応する符号付き整数型のリテラルとする |
15-
| [エスケープシーケンスの区切り](cpp23/delimited_escape_sequences.md.nolink) | エスケープシーケンスの範囲を明確にする構文を追加する |
15+
| [エスケープシーケンスの区切り](cpp23/delimited_escape_sequences.md) | エスケープシーケンスの範囲を明確にする構文を追加する |
1616
| [暗黙的なムーブを簡略化](cpp23/simpler_implicit_move.md.nolink) | 参照を返す関数の`return`文で暗黙的にムーブされない問題を修正 |
1717

1818
これらに加えて、ライブラリ機能として拡張浮動小数点数型が定義された。[`<stdfloat>`](/reference/stdfloat.md)を参照。
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# エスケープシーケンスの区切り
2+
* cpp23[meta cpp]
3+
4+
## 概要
5+
C++23では、文字列リテラル中に記述するエスケープシーケンスとユニバーサルキャラクタ名の範囲を明確にするための波カッコ (`{}`) で囲む構文が追加される。
6+
7+
```cpp
8+
// 8進数のエスケープシーケンス
9+
"\18"; // 8は8進数に含まれないので'\1'と'8'の2文字を表す
10+
"\o{1}8"; // C++23 : 上記と等価
11+
"\o{18}"; // C++23 : コンパイルエラー!
12+
13+
// 16進数のエスケープシーケンス
14+
"\xabc"; // 1文字
15+
"\xab" "c"; // 2文字 (文字列リテラルを分けて連結させる回避策)
16+
"\x{ab}c"; // C++23 : 2文字を表す
17+
18+
// ユニバーサルキャラクタ名
19+
u8"\u0001F1F8"; // 4文字か8文字のみ指定できる制限があるので先頭0埋めする
20+
u8"\u{1F1F8}"; // C++23 : 5文字のコードポイントも記述できる
21+
```
22+
23+
8進数エスケープシーケンスには3文字までという制限、ユニバーサルキャラクタ名には4文字または8文字の制限があったが、この構文ではその制限はない。
24+
25+
26+
## この機能が必要になった背景・経緯
27+
### ユニバーサルキャラクタ名の4文字・8文字制限
28+
ユニバーサルキャラクタ名は4文字か8文字で指定する制限があったため、5文字のコードポイントを指定するために`\U0001F1F8`のように先頭を0埋めする必要があった。
29+
30+
### エスケープシーケンスの範囲を表現しにくい問題
31+
8進数または16進数によるエスケープシーケンスは、8進数は3文字まで、16進数は無制限の文字数という制限の違いがあり、また、8進数または16進数ではない文字が現れることでエスケープシーケンスの範囲が終了するため注意が必要であった。
32+
33+
34+
## 関連項目
35+
- [C++11 `char16_t``char32_t`](/lang/cpp11/char16_32.md)
36+
37+
38+
## 参照
39+
- [P2290R3 Delimited escape sequences](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2290r3.pdf)

0 commit comments

Comments
 (0)