【发布时间】:2019-08-19 17:26:54
【问题描述】:
这个问题来自Can lambda functions be recursive?。 accepted answer 表示下面显示的递归 lambda 函数有效。
std::function<int (int)> factorial = [&] (int i)
{
return (i == 1) ? 1 : i * factorial(i - 1);
};
不过,a comment 指出
这样的函数不能安全返回
,原因在this comment中提供:
返回它会破坏局部变量,并且该函数具有对该局部变量的引用。
我不明白原因。据我所知,捕获变量相当于将它们保留为数据成员(根据捕获列表按值或按引用)。那么在这种情况下什么是“局部变量”?此外,即使在 g++ 7.4.0 上使用 -Wall -Wextra -std=c++11 选项,下面的代码也能正常编译和工作。
#include <iostream>
#include <functional>
int main() {
std::function<int (int)> factorial = [&factorial] (int i)
{
return (i == 1) ? 1 : i * factorial(i - 1);
};
std::cout << factorial(5) << "\n";
}
为什么函数不安全?这个问题仅限于这个函数,还是整个 lambda 表达式?
【问题讨论】:
-
我认为评论意味着你不能从函数中返回它。因此,如果您不能拥有
std::function<int (int)> foo();,请返回您的factorial。factorial将是foo()中的局部变量,并且您返回的函数对象将引用它。 -
见this。它可以爆炸,它可以工作。我们只知道它是 UB。
-
C++ Returning reference to local variable可能重复(根本原因相同)
-
@ynn 您在问题中显示的示例具有明确定义的行为。
标签: c++