llano y simplemente (de C++ 11 6.6.3 "La instrucción de retorno"):
que fluye fuera del extremo de una función es equivalente a un retorno sin valor; esto da como resultado un comportamiento indefinido en una función que devuelve valor.
Por lo que el compilador puede hacer lo que quiera. Claramente, un diagnóstico es algo que preferiría de un compilador, pero hay momentos en que puede ser difícil de diagnosticar (como cuando el retorno está dentro de la lógica condicional, y el 'final' de la función nunca se alcanzaría).
Tenga en cuenta que me sale el siguiente mensaje de advertencia con GCC 4.6.1 (usando la opción Wall
):
test.cpp:8:1: warning: no return statement in function returning non-void [-Wreturn-type]
no estoy seguro de qué opciones Ideone pasa a GCC (imagino que -Wall
harían lo mismo con la versión 4.3.4 que usa ideone).
Parte de la información relacionada:
En C que está bien para una función que se declara para devolver un valor que en realidad no hacerlo en ciertas circunstancias; en C solo da como resultado un comportamiento indefinido si el valor de retorno de la función es realmente usado. Pre-estándar C no siempre soportaba el tipo void
, por lo que las funciones que no devolvían nada a menudo se declaraban para devolver int
, explícita o implícitamente. De C99 6.9.1/12 "Definiciones de funciones": si se alcanza el }
que termina una función, y el llamador utiliza el valor de la llamada de función, el comportamiento no está definido.
Además, como se menciona en un par de comentarios, que fluye desde el final de main()
es tratado especialmente por C++ y C99 y posterior.
¿Podría consultar el origen de la cita? –
@DesmondHume: El estándar. – Xeo
La única vez que está bien definido es para 'main' –