¿Es esta recursión infinita UB?

En C ++ 11, como un bucle infinito sin efectos secundarios, el siguiente progtwig es UB:

int main() { while (true) {} } 

¿Es el siguiente también UB?

 void foo() { foo(); } int main() { foo(); } 

Las citas del estándar para ambos progtwigs serían ideales.

Es UB porque no está redactado en términos de bucles, sino en términos de (1.10p24):

La implementación puede suponer que cualquier subproceso llevará a cabo una de las siguientes acciones:

  • Terminar,
  • hacer una llamada a una función de E / S de la biblioteca,
  • acceder o modificar un objeto volátil, o
  • realizar una operación de sincronización o una operación atómica.

Esto se aplica a ambos, a diferencia de la formulación más antigua en uno de los borradores de C ++ 0x. (Vea esta pregunta para discusiones).

Tenga en cuenta que, sin tener en cuenta eso, el comportamiento puede ser indefinido fácilmente si la recursión excede el límite de implementación de la cantidad de llamadas a funciones recursivas anidadas. Ese ha sido siempre el caso.

No creo que el estándar diga que el comportamiento no está definido, solo dice que un ciclo que no tiene efectos secundarios se puede suponer que terminará.

Asi que:

 int main() { while (true) {} } 

Puede terminar o repetir para siempre.

 void foo() { foo(); } int main() { foo(); } 

También puede terminar, repetirse continuamente o posiblemente quedarse sin espacio en la stack (si el comstackdor no implementa la recursión final).

No creo que ninguno tenga derecho a hacer otra cosa que no sea la enumerada, por lo que no creo que el comportamiento sea completamente “indefinido”.