我有以下功能(在Visual C ++ 2005中编写)
int &getInt_1()
{
int a = 5;
int &p = a;
int p1 = p; // Line 1
return p1;
}
int &getInt_2()
{
int a = 5;
int &p = a;
return p;
}
据我所知,上述两个函数都返回局部变量的地址。如果我是对的,那么我有一些问题如下:
上述功能有何不同?为什么getInt_1()
会在"returning address of local variable"
没有的情况下从编译器(getInt_2()
)收到警告?
Line 1
是什么意思?在Line 1
之后,p1
是否也会成为对a
的引用?
答案 0 :(得分:3)
getInt_1
返回对p1的引用。 getInt_2
返回对a的引用。两者都是相同的未定义行为,不要这样做。 VC应该对两者发出警告。答案 1 :(得分:1)
1)因为你所指出的,两者都是未定义的行为。这可能是对MSVS的疏忽。
2)不,p1
本身不会成为参考。该行等同于int p1 = a;
答案 2 :(得分:1)
在第一种情况下,编译器很容易显示您正在返回对局部变量的引用;在第二种情况下,它更难,因为它只有一个任意引用,恰好引用一个局部变量。这可能就是为什么你在第一种情况下得到警告而不是第二种情况。
不,在第一种情况下p1
只是一个普通的int
,而不是int&
。