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

C++ 这些本地函数的返回地址之间有什么区别?,c++,reference,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; } 如我所知,以上两个函数都返回局部变量的地址。如果我是对的,那么我有以下几个问题: 以上功能之间有什么

我在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从返回局部变量地址的编译器获得警告,而getInt_2没有

第1行是什么意思?第1行之后,p1是否也成为a的参考


1由于您指出的原因,两者都是未定义的行为。这可能是MSV的疏忽


2不,p1本身不会成为参考。该线等于int p1=a

1由于您指出的原因,这两种行为都是未定义的行为。这可能是MSV的疏忽


2不,p1本身不会成为参考。该线等于int p1=a

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


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

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

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

getInt_1返回对p1的引用。getInt_2返回对a的引用。两者都是相同的未定义行为,不要这样做。VC应该在这两方面都给出警告。 不,您只需复制值。 getInt_1返回对p1的引用。getInt_2返回对a的引用。两者都是相同的未定义行为,不要这样做。VC应该在这两方面都给出警告。 不,您只需复制值。
未定义的行为。。。编译器未注意到。未定义的行为。。。编译器没有注意到。@你确定吗?我记得有一句标准的话,仅仅返回一个对临时文件的引用是错误的。你确定吗?我记得有一句标准的话,仅仅返回对临时文件的引用就是UB。