2012-05-06 26 views
5

Esto ocurre al compilar el siguiente código en Visual Studio 2010. Mi pregunta es: el compilador de C++ advertirá si una función devuelve la dirección de una variable local, pero ¿por qué no avisa al devolver una referencia local a una variable local? ?¿Por qué el compilador no advierte "devolver la dirección de la variable local o temporal" al devolver una referencia local a una variable local?

¿Sigue siendo incorrecto (devolver una referencia local a una variable local), pero solo que el compilador no pudo detectarlo? El examen de las direcciones de 'num' y 'r' revela que comparten la misma ubicación de memoria.

#include <iostream> 
using namespace std; 

int & intReference() { 
    int num = 5; 
    int &r = num; 
    cout << "\nAddress of num: " << &num; 

    //return num; // Compiler warning: C4172: returning address of local variable or temporary 
    return r; // No warning? 
} 

void main() { 
    int &k = intReference(); 
    cout << "\nk = " << k; // 5 
    cout << "\nAddress of k: " << &k; // same address as num 

    char c; 
    cin.get(c); 
} 
+0

posible duplicado de [¿cuáles son las diferencias entre éstos-dirección de retorno de las funciones locales?] (Http://stackoverflow.com/questions/10410208/what-are-the-differences-between-these-returning-address- of-local-functions) –

+0

Para que lo sepas, MSVC 2015 todavía no advierte sobre eso. Ni siquiera en -Wall. Me acabo de picar por un estúpido error como este ayer. Y estoy de acuerdo con usted, para el ojo del compilador no compilador, parece un error tan fácil de detectar. De todos modos, lo que realmente me molesta es que tenemos que vivir con advertencias como el "parámetro formal sin referencia" bastante inútil, pero un error catastrófico como este recibe un pase libre. – user1593842

Respuesta

6

Sí, sigue siendo incorrecto.

El compilador no puede detectar todos los casos en los que está haciendo cosas peligrosas (o ilegales). Advierte cuando los encuentra, pero no puede identificar todos los casos (y no tiene por qué).

+0

Así que esto es incorrecto: http://www.functionx.com/cpp/examples/returnreference.htm – fxam

+3

Sí, ese es un terrible ejemplo. – Mat

Cuestiones relacionadas