2012-04-11 54 views
3

所以,我有這兩個功能ref()pointy()分別創建一個本地參考,並指向本地定義的INT:編譯器警告重:引用局部變量

#include <iostream> 

int& ref() { 
    int knuckles = 6; 
    int &chuckles = knuckles; 
    return chuckles; 
}; 

int* pointy() { 
    int buckles = 8; 
    return &buckles; 
}; 

int main(int argc, char **argv) { 
    int a = ref(), *b = pointy(); 
    int c = 14, d = 20; 
    std::cout << a << ' ' << *b << ' ' << c+d; 
}; 

代碼編譯罰款,並給出了關於返回局部變量buckles的地址的警告,但是我擔心的是它沒有說任何關於ref()返回對knuckles的引用。 我的編譯器(g ++通過MinGW,如果有區別)只是在工作中睡覺?有沒有關於引用使參照物超出範圍的內容?或者是我的參考語法不好?

非常感謝!

+2

但你也不回'knuckles'一個參考,你回來'這可能很容易地被分配到非chuckles' - 本地參考。 – Nick 2012-04-11 16:14:05

+6

你有一個錯誤的方法:你的編譯器通過指出'pointy'中的問題來幫助你。這不是必需的。你已經成功地欺騙了它在'ref'中看不到問題。 – Mat 2012-04-11 16:15:03

+3

編譯器不需要診斷任何這些錯誤。感謝它甚至捕獲了其中一個。 (它沒有認出'ref'中的錯誤,因爲你在另一個變量裏走私它 – 2012-04-11 16:15:23

回答

4

你的兩個測試用例不是平行的。這個程序:

#include <iostream> 

int& ref() { 
    int knuckles = 6; 
    return knuckles; 
}; 

int* pointy() { 
    int buckles = 8; 
    return &buckles; 
}; 

int main(int argc, char **argv) { 
    int a = ref(), *b = pointy(); 
    int c = 14, d = 20; 
    std::cout << a << ' ' << *b << ' ' << c+d; 
}; 

可生產這些警告:

$ g++ -O4 -std=c++0x x.cc -o x 
x.cc: In function ‘int& ref()’: 
x.cc:4:7: warning: reference to local variable ‘knuckles’ returned [enabled by default] 
x.cc: In function ‘int* pointy()’: 
x.cc:9:9: warning: address of local variable ‘buckles’ returned [enabled by default] 
+0

所以它確實。謝謝! – 2012-04-11 16:27:43