繁体   English   中英

在 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.
}

在这两种情况下,它都是未定义的行为,因为任何非静态局部变量都不能作为引用或指针返回,因为它在该函数的作用域结束后被销毁。 因此该引用或指针将无效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM