为啥我在函数内部使用引用并通过引用返回它仍然有效? [复制]
Posted
技术标签:
【中文标题】为啥我在函数内部使用引用并通过引用返回它仍然有效? [复制]【英文标题】:Why I use reference inside the function and return it by reference still work? [duplicate]为什么我在函数内部使用引用并通过引用返回它仍然有效? [复制] 【发布时间】:2019-11-26 06:12:05 【问题描述】:我知道函数中局部变量的生命周期将在函数完成后结束。但是我发现下面的例子,它可以工作。
int & foo()
int b = 5;
int &a = b;
return a;
int main()
int &c = foo();
cout<<c;
return 0;
另外,我尝试使用指针指向局部变量并返回指针。它也可以工作。
int * foo()
int b = 5;
int *a = &b;
return a;
int main()
int *c = foo();
cout<<*c;
return 0;
我很困惑。我了解到局部变量的生命周期将在函数完成后结束,因为局部变量存储在堆栈内存中。表示函数完成后,局部变量的内存将被释放。然后,指针或引用将不指向任何内容。
但是,上面的两个例子验证了我的概念是错误的。是什么原因?
【问题讨论】:
它恰好起作用。 work 这个词在这里没有意义。它对您有用,因为您希望打印出5
。我希望 -1
被打印出来,所以对我来说,该程序无法工作。这就是未定义行为的结果。
【参考方案1】:
您的观察被称为未定义的行为:该语言对程序的行为没有任何限制。未定义行为的一种可能表现形式是事物看起来像是在“工作”。
但是您确实不希望在您的程序中有任何未定义的行为。请勿使用该构造,即使它们看起来有效。
【讨论】:
但是你能解释一下为什么它可以工作吗?谢谢。 就一个具有未定义行为的程序争论没有多大意义。即使它今天似乎“工作”,但明天它可能会停止“工作”。为了满足您的好奇心,请查看生成的汇编代码。 @MichaelTsai 它不起作用。这就像掷骰子,期待 1 并得到 1,然后得出结论,骰子总是掷 1。到目前为止,这不是最好的类比,但它仍然比“它有效”更好地描述了这种情况以上是关于为啥我在函数内部使用引用并通过引用返回它仍然有效? [复制]的主要内容,如果未能解决你的问题,请参考以下文章