Función con valor de retorno faltante, comportamiento en tiempo de ejecución

Como se esperaba, el comstackdor (VisualStudio 2008) dará una advertencia

advertencia C4715: ‘doSomethingWith’: no ​​todas las rutas de control devuelven un valor

al comstackr el siguiente código:

int doSomethingWith(int value) { int returnValue = 3; bool condition = false; if(condition) // returnValue += value; // DOH return returnValue; } int main(int argc, char* argv[]) { int foo = 10; int result = doSomethingWith(foo); return 0; } 

Pero el progtwig funciona bien. El valor de retorno de la función doSomethingWith () es 0.

Es solo un comportamiento indefinido, o hay una cierta regla sobre cómo se crea / calcula el valor del resultado en el tiempo de ejecución. ¿Qué sucede con los tipos de datos que no son POD como valor de retorno?

Es un comportamiento Indefinido como se especifica en la sección 6.6.3 de la norma ISO C ++:

Fluir fuera del final 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.

Para los procesadores x86, la convención de llamadas estándar coloca el valor de retorno en el registro EAX. Prácticamente significa que para la mayoría de los comstackdores si llegamos al final de la función sin regresar, se devolverá el resultado de la última operación matemática. Sin embargo, no puede confiar en eso y no es portátil.

http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl

No devolver un valor de una función de devolución de valor conduce a un comportamiento indefinido.

Actualizando @piotr respuesta.

De la Norma C ++ 17 Sección 9.6.3

Salir del final de un constructor, un destructor o una función con un tipo de retorno de vacío cv es equivalente a un retorno sin operando. De lo contrario, salir del final de una función distinta de la principal (6.6.1) produce un comportamiento indefinido.