[英]Behaviour of a closure that captures a local variable of function that it was returned from, in C++
我有点困惑为什么以下函数normal_get()
和closure_get()
行为不同。 当然,一个返回一个闭包,另一个返回一个局部变量的引用。 但本质上,前一个返回值(闭包)在调用时会做同样的事情,即返回对返回它的函数的局部变量的引用。
我不是 C++ 专家,我知道不能返回对函数内局部变量的引用。 但是我想确认关闭场景是否是未定义的或预期的行为,并且那里没有编译器魔法? (因为我最近开始玩 C++ 中的闭包而问)
我正在使用 g++ 9.3.0
g++ -std=c++2a test.cpp
#include <iostream>
#include <functional>
using namespace std;
auto closure_get() {
int val = 10;
auto f = [&]() { // capturing by reference
return &val;
};
return f;
}
auto normal_get() {
int val = 10;
return &val;
}
int main () {
auto func = closure_get();
auto val = normal_get();
std::cout<<*func()<<std::endl; // This always prints `10`. Should this be considered as undefined behavior though?
std::cout<<*val<<std::endl; // This always segfaults as expected. It's still undefined behavior even if it prints some value.
}
在这两种情况下,它都是未定义的行为,因为任何非静态局部变量都不能作为引用或指针返回,因为它在该函数的作用域结束后被销毁。 因此该引用或指针将无效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.