这些本地函数的返回地址有什么区别?

时间:2012-05-02 08:31:05

标签: c++ reference

我有以下功能(在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;
}

据我所知,上述两个函数都返回局部变量的地址。如果我是对的,那么我有一些问题如下:

  1. 上述功能有何不同?为什么getInt_1()会在"returning address of local variable"没有的情况下从编译器(getInt_2())收到警告?

  2. Line 1是什么意思?在Line 1之后,p1是否也会成为对a的引用?

3 个答案:

答案 0 :(得分:3)

  1. getInt_1返回对p1的引用。 getInt_2返回对a的引用。两者都是相同的未定义行为,不要这样做。 VC应该对两者发出警告。
  2. 不,你只需复制价值。

答案 1 :(得分:1)

1)因为你所指出的,两者都是未定义的行为。这可能是对MSVS的疏忽。

2)不,p1本身不会成为参考。该行等同于int p1 = a;

答案 2 :(得分:1)

在第一种情况下,编译器很容易显示您正在返回对局部变量的引用;在第二种情况下,它更难,因为它只有一个任意引用,恰好引用一个局部变量。这可能就是为什么你在第一种情况下得到警告而不是第二种情况。

不,在第一种情况下p1只是一个普通的int,而不是int&