Skip to content

Commit 97d288b

Browse files
committed
C++26: 「文字列リテラルの文字エンコーディング失敗を不適格とする」を追加 (close #1173)
1 parent d22fd0c commit 97d288b

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
@@ -293,7 +293,7 @@
293293
|----------|------|------------|----------------|------------|--------------|
294294
| P2752R3: [`std::initializer_list`の配列を静的ストレージに配置する](/lang/cpp26/static_storage_for_braced_initializers.md.nolink) | `std::vector v = {1, 2, 3};`のような初期化で初期化子リストを静的ストレージに配置することで無駄なコピーをなくす | 14 | | | |
295295
| P2169R4: [宣言のみで使用しない変数の名前として`_`をサポート](/lang/cpp26/nice_placeholder_with_no_name.md) | 変数名`_`は暗黙で`[[maybe_unused]]`が指定される | 14 | 18 | | |
296-
| P1854R4: [文字列リテラルの文字エンコーディング失敗を不適格とする](/lang/cpp26/making_non-encodable_string_literals_ill-formed.md.nolink) | 文字列リテラルのエンコーディング時に文字表現が失われる場合にコンパイルエラーにする | 14 | 14 | | |
296+
| P1854R4: [文字列リテラルの文字エンコーディング失敗を不適格とする](/lang/cpp26/making_non-encodable_string_literals_ill-formed.md) | 文字列リテラルのエンコーディング時に文字表現が失われる場合にコンパイルエラーにする | 14 | 14 | | |
297297
| P2361R6: [コンパイル時にのみ使用される文字列の扱いを明確化](/lang/cpp26/unevaluated_strings.md.nolink) | `static_assert``[[deprecated]]`などで使用されるコンパイル時の文字列について、文字コードの指定を禁止し、実行時エンコーディングが行われないことを規定 | 14 | 18 | | |
298298
| P2552R3: [属性の無視性を見直し](/lang/cpp26/on_the_ignorability_of_standard_attributes.md.nolink) | 構文として適格な属性のみを無視できるようにし、そうでない属性の使用を不適格とする | | | | |
299299
| P2738R1: [定数式での`void*`からポインタ型へのキャストを許可](/lang/cpp26/constexpr_cast_from_voidptr.md.nolink) | 型消去のために`void*`からポインタ型へのキャストを許可する | 14 | 17 | | |

lang/cpp23/remove_non_encodable_wide_character_literals_and_multicharacter_wide_character_literals.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,9 @@ wchar_t c = L'é'; // C++20:OK, C++23:NG \u0065\u0301
3030
変数`c`のケースは1文字のように見えても複数のコードポイントで構成されており、マルチキャラクタリテラルの一種であるため禁止とする。
3131

3232

33+
## <a id="relative-page" href="#relative-page">関連項目</a>
34+
- [C++26 文字列リテラルの文字エンコーディング失敗を不適格とする](/lang/cpp26/making_non-encodable_string_literals_ill-formed.md)
35+
36+
3337
## 参照
3438
- [P2362R3 Remove non-encodable wide character literals and multicharacter wide character literals](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2362r3.pdf)

lang/cpp26.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ C++26とは、2026年中に改訂される予定の、C++バージョンの通
2525

2626
| 言語機能 | 説明 |
2727
|----------|------|
28-
| [文字列リテラルの文字エンコーディング失敗を不適格とする](/lang/cpp26/making_non-encodable_string_literals_ill-formed.md.nolink) | 文字列リテラルのエンコーディング時に文字表現が失われる場合にコンパイルエラーにする |
28+
| [文字列リテラルの文字エンコーディング失敗を不適格とする](/lang/cpp26/making_non-encodable_string_literals_ill-formed.md) | 文字列リテラルのエンコーディング時に文字表現が失われる場合にコンパイルエラーにする |
2929
| [コンパイル時にのみ使用される文字列の扱いを明確化](/lang/cpp26/unevaluated_strings.md.nolink) | `static_assert``[[deprecated]]`などで使用されるコンパイル時の文字列について、文字コードの指定を禁止し、実行時エンコーディングが行われないことを規定 |
3030

3131

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# 文字列リテラルの文字エンコーディング失敗を不適格とする [P1854R4]
2+
* cpp26[meta cpp]
3+
4+
<!-- start lang caution -->
5+
6+
このページはC++26に採用される見込みの言語機能の変更を解説しています。
7+
8+
のちのC++規格でさらに変更される場合があるため[関連項目](#relative-page)を参照してください。
9+
10+
<!-- last lang caution -->
11+
12+
## 概要
13+
C++23では、以下のような1ワイド文字に収まらないリテラルが不適格 (コンパイルエラー) になるよう仕様変更された。
14+
15+
```cpp
16+
wchar_t a = L'🤦'; // C++20:OK, C++23:OK \U0001f926
17+
wchar_t b = L'ab'; // C++20:OK, C++23:NG マルチキャラクタリテラル
18+
wchar_t c = L''; // C++20:OK, C++23:NG \u0065\u0301
19+
```
20+
21+
C++26ではさらに、文字列リテラルとしてエンコーディングできない文字の扱いが実装定義でコンパイラーに任されていたものを、不適格になるよう仕様変更する。
22+
23+
```cpp
24+
wchar_t ao = L'\x123456789abcdef0'; // C++23:実装定義, C++26:NG (範囲外)
25+
char16_t ap = u'\x12345678'; // C++23:実装定義, C++26:NG (範囲外)
26+
```
27+
28+
また、マルチ文字リテラル (ひとつの文字リテラルに4文字まで入れられて値が実装定義なもの。例として`'intl'`) については、単一のコードユニットにエンコードされるもののみ許可される。
29+
30+
31+
## 関連項目
32+
- [C++23 1ワイド文字に収まらないワイド文字リテラルを禁止する](/lang/cpp23/remove_non_encodable_wide_character_literals_and_multicharacter_wide_character_literals.md)
33+
34+
35+
## 参照
36+
- [P1854R4 Making non-encodable string literals ill-formed](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1854r4.pdf)

0 commit comments

Comments
 (0)