C++26 macht while(true)-Endlosschleifen endlich wohldefiniert
C++26: Trivial infinite loops are no longer undefined behaviour
In C++ galt eine triviale Endlosschleife wie while(true); bislang als undefiniertes Verhalten. Compiler durften annehmen, dass sie terminiert, und Clang entfernte sie sogar komplett – mit teils bizarren Folgen. Der Artikel erklärt, wie es dazu kam, warum C das schon immer richtig machte und wie C++26 mit P2809R3 dieses Verhalten korrigiert: Triviale Endlosschleifen werden durch einen Aufruf von std::this_thread::yield() ersetzt und sind nun wohldefiniert.
Das Lustige ist, dass C das richtig gemacht hat. C++11 und C11 führten beide Forward-Progress-Regeln ein, aber C enthielt eine zusätzliche Regel: Schleifen, deren kontrollierender Ausdruck ein konstanter Ausdruck ist, darf man nicht als terminierend annehmen.