最終更新日時: 2025年07月12日 02時16分44秒 (JST)
Koichi Murase が更新

履歴 編集

# 空の無限ループは未定義動作ではないと規定 [P2809R3](C++26)

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

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

## 概要

C++23までは、以下のような「条件式が定数式で`true`となる空の無限ループ」が未定義動作と規定されていた。

    while (true)
      ;

C++26ではこのような無限ループは以下のように展開され、並行プログラムの進行保証をした上で未定義動作ではないと規定される。

    while (true)
      std::this_thread::yield();

## 仕様

以下の形式になっている文を、「トリビアルで空のイテレーション文」であると定義する。

- `while (条件式) ;`
- `while (条件式) { }`
- `do ; while (条件式) ;`
- `do { } while (条件式) ;`
- `for ( 初期化式 ; 条件式(省略可) ; ) ;`
- `for ( 初期化式 ; 条件式(省略可) ; ) { }`

また、「トリビアルで空のイテレーション文」のうち、条件式が定数式として`true`に展開される文を「トリビアルな無限ループ」であると定義する。トリビアルな無限ループ内の文は、`std::this_thread::yield()`の呼び出しに置き換えられる。

注：フリースタンディング環境においては、並行進行保証はされない。そのようなシステムにおいては明示的な協調操作が必要となる。

## 参照

- P2809R3 Trivial infinite loops are not Undefined Behavior