提问人:vikram2784 提问时间:11/5/2021 最后编辑:vikram2784 更新时间:11/5/2021 访问量:119
在 C++ 中捕获函数的局部变量的闭包的行为
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.
}
答:
3赞
foragerDev
11/5/2021
#1
在这两种情况下,它都是未定义的行为,因为任何非静态局部变量都不能作为引用或指针返回,因为它在该函数的作用域结束后被销毁。因此,该引用或指针将无效。
上一个:如何将封盖包裹在封盖中?
下一个:C++ 闭包捕获变量
评论