2010-11-03 11 views
6

Ésta es una función válida en C++:Una función declarada para devolver int no devuelve nada. ¿Es este comportamiento indefinido?

int f() 
{ 
    if(false) 
    { 
     return 42; 
    } 
} 

La siguiente definición provoca UB:

int x = f(); //return value used 

La pregunta: hace lo siguiente causa UB declaración de la expresión?

f(); 

Cita de la norma sería muy bienvenida. Gracias

Advertencia: Observaciones sobre la estilística son irrelevantes :)

+0

Estoy 99.9999% seguro de que es un UB. E incluso si no lo es, este no es un estilo de programación que uno recomendaría :) –

+0

Intentar ejecutar código en un comentario no es UB. –

+2

me gusta cómo lo maneja el compilador de C#: en este caso, habrá un error de compilación: "No todas las rutas de códigos devuelven un valor" – Andrey

Respuesta

8

C++ 03 §6.6.3/2:

que fluye fuera del extremo de una función es equivalente a un retorno con sin valor; esto da como resultado un comportamiento indefinido en una función que devuelve valor.

Así que este es un UB en una función en sí.

Por cierto gcc le da una buena advertencia que señala a esta UB:

In function 'int f()': 
Line 7: warning: control reaches end of non-void function 
+0

¡Gracias! La respuesta se aceptará en 7 minutos :) –

+3

la única respuesta (de 4) que realmente dice lo que se pidió. – Andrey

+0

@Armen Tsirunyan: tan precisa sincronización =) – vitaut

3

C++ 03, §6.6.3/2: "fluye fuera de la 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 ".

Tenga en cuenta que lo mismo no es cierto en C.

+0

Hmm .. interesante. Gracias por la respuesta. SO en C solo el primer caso es UB? –

+0

¿Qué sucede en C? – Lazer

+0

@Lazer: debe usar el valor. 'f();' solo está bien. – GManNickG

Cuestiones relacionadas