Skip to content

Commit 349b492

Browse files
committed
C++26: 「空の無限ループは未定義動作ではないと規定」を追加 (close #1326)
1 parent 7c7167b commit 349b492

3 files changed

Lines changed: 49 additions & 2 deletions

File tree

implementation-status.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@
305305
| P3106R1: [要素数不明の配列を集成体初期化する規則を明確化](/lang/cpp26/clarifying_rules_for_brace_elision_in_aggregate_initialization.md.nolink) | 配列要素の集成体初期化で`{}`が省略された場合の矛盾していた規定を修正 | yes | 17 | | |
306306
| P0609R3: [構造化束縛への属性を許可](/lang/cpp26/attributes_for_structured_bindings.md) | `auto [a, b [[maybe_unused]], c] = f();`のように構造化束縛の要素に対して属性を付加できるようにする | 15 | 19 | | |
307307
| P3034R1: [モジュール宣言でのモジュール名のマクロ展開を禁止する](/lang/cpp26/module_declarations_shouldnt_be_macros.md.nolink) | `export module MACRO_NAME;`を禁止 | | | | |
308-
| P2809R3: [自明な無限ループは未定義動作ではないと規定](/lang/cpp26/trivial_infinite_loops_are_not_undefined_behavior.md.nolink) | 並行プログラムの進行保証などを考慮して無限ループを未定義動作ではないものとする | 14 | 19 | | |
308+
| P2809R3: [空の無限ループは未定義動作ではないと規定](/lang/cpp26/trivial_infinite_loops_are_not_undefined_behavior.md) | 並行プログラムの進行保証などを考慮して空の無限ループを未定義動作ではないものとする | 14 | 19 | | |
309309
| P2795R5: [未初期化変数の読み取りをエラー性動作とする](/lang/cpp26/erroneous_behavior_for_uninitialized_reads.md) | 初期化されていない自動変数の読み取りの安全性を規定する | | | | |
310310
| P2573R2: [関数宣言を削除する理由を指定できるようにする](/lang/cpp26/delete_reason.md) | `f() = delete("reason");` | 15 | 19 | | |
311311
| P2893R3: [可変引数テンプレートで`friend`宣言をできるようにする](/lang/cpp26/variadic_friends.md.nolink) | クラステンプレートの可変引数テンプレートでまとめて`friend`宣言できるようにする | 15 | | | |

lang/cpp26.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ C++26とは、2026年中に改訂される予定の、C++バージョンの通
3434
| 言語機能 | 説明 |
3535
|----------|------|
3636
| [条件式での構造化束縛の使用を許可](/lang/cpp26/structured_binding_declaration_as_a_condition.md) | 式全体を`bool`値に変換できる場合に条件式で構造化束縛を使用できることとする |
37-
| [自明な無限ループは未定義動作ではないと規定](/lang/cpp26/trivial_infinite_loops_are_not_undefined_behavior.md.nolink) | 並行プログラムの進行保証などを考慮して無限ループを未定義動作ではないものとする |
37+
| [空の無限ループは未定義動作ではないと規定](/lang/cpp26/trivial_infinite_loops_are_not_undefined_behavior.md) | 並行プログラムの進行保証などを考慮して空の無限ループを未定義動作ではないものとする |
3838

3939

4040
### 関数
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# 空の無限ループは未定義動作ではないと規定 [P2809R3]
2+
* cpp26[meta cpp]
3+
4+
<!-- start lang caution -->
5+
6+
このページはC++26に採用される見込みの言語機能の変更を解説しています。
7+
8+
のちのC++規格でさらに変更される場合があるため関連項目を参照してください。
9+
10+
<!-- last lang caution -->
11+
12+
## 概要
13+
C++23までは、以下のような「条件式が定数式で`true`となる空の無限ループ」が未定義動作と規定されていた。
14+
15+
```cpp
16+
while (true)
17+
;
18+
```
19+
20+
C++26ではこのような無限ループは以下のように展開され、並行プログラムの進行保証をした上で未定義動作ではないと規定される。
21+
22+
```cpp
23+
while (true)
24+
std::this_thread::yield();
25+
```
26+
* std::this_thread[link /reference/thread/this_thread.md]
27+
* yield()[link /reference/thread/this_thread/yield.md]
28+
29+
30+
## 仕様
31+
以下の形式になっている文を、「トリビアルで空のイテレーション文」であると定義する。
32+
33+
- `while (条件式) ;`
34+
- `while (条件式) { }`
35+
- `do ; while (条件式) ;`
36+
- `do { } while (条件式) ;`
37+
- `for ( 初期化式 ; 条件式(省略可) ; ) ;`
38+
- `for ( 初期化式 ; 条件式(省略可) ; ) { }`
39+
40+
また、「トリビアルで空のイテレーション文」のうち、条件式が定数式として`true`に展開される文を「トリビアルな無限ループ」であると定義する。トリビアルな無限ループ内の文は、[`std::this_thread`](/reference/thread/this_thread.md)`::`[`yield()`](/reference/thread/this_thread/yield.md)の呼び出しに置き換えられる。
41+
42+
注:フリースタンディング環境においては、並行進行保証はされない。そのようなシステムにおいては明示的な協調操作が必要となる。
43+
44+
45+
## 参照
46+
- [P2809R3 Trivial infinite loops are not Undefined Behavior](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2809r3.html)
47+

0 commit comments

Comments
 (0)