我正在学习左值/右值,并且有一个关于左值的示例:
int& foo();
foo() = 42; // ok, foo() is an lvalue
通常,人们会让foo()在其体内返回全局变量或静态变量,但是如果我们在foo的体内定义局部变量,它也可以工作(警告:对与local关联的堆栈内存的引用变量'i'返回[-Wreturn-stack-address] ):
#include <iostream>
using namespace std;
int &foo(){int i=7; return i;};
int main() {
foo() = 42;
return 0;
}
为什么C ++允许这样做,它是闭包吗?
答案 0 :(得分:2)
此程序表现出未定义的行为,方法是在其生命周期结束后访问对象。
返回对局部变量的引用没有意义-调用者对此类引用的任何使用都是未定义的,因为该时刻必定会销毁该局部变量。