1

我有以下功能(用 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

4

3 回答 3

3
  1. getInt_1返回对 p1 的引用。getInt_2返回对 a 的引用。两者都是相同的未定义行为,不要这样做。VC应该对两者都发出警告。
  2. 不,您只需复制该值。
于 2012-05-02T08:34:35.563 回答
1

1)由于您指出的,两者都是未定义的行为。这可能是 MSVS 中的一个疏忽。

2) 不,p1本身不会成为参考。那条线相当于int p1 = a;

于 2012-05-02T08:33:04.110 回答
1

在第一种情况下,编译器很容易表明您正在返回对局部变量的引用;在第二种情况下,它更难,因为它只是有一个恰好引用局部变量的任意引用。这可能就是您在第一种情况下收到警告但在第二种情况下没有收到警告的原因。

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

于 2012-05-02T08:33:38.190 回答