2012-04-11 82 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