为什么c语言中lambda表达式不返回时会出现奇怪行为?

2026-04-16 19:112阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计439个文字,预计阅读时间需要2分钟。

为什么c语言中lambda表达式不返回时会出现奇怪行为?

我发现了一些难以理解的东西。我认为它可能与函数栈和未定义的行为有关。假设我有一个功能工厂模板(一个简单的模板):

cpptemplatestd::function build_add_function(){ return [N](const int n) { return N + n; };}

我找到了一些无法理解的东西.我认为它应该与函数堆栈和一些未定义的行为有关.

假设我有一个功能工厂模板(傻一个):

template <unsigned int N=10> std::function<int&&(const int& n)> build_add_function() { return [](const int& n) -> int&& {std::move(n+N);}; }

如您所见,它缺少非void函数的return语句,因此编译器向我发出警告……
奇怪的是它“按预期”工作

为什么c语言中lambda表达式不返回时会出现奇怪行为?

int main() { auto foo = build_add_function(); std::cout << foo(10); }

主要产出:20

当然,为了修复代码,我添加了return语句,它给了我一个分段错误

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

我对我正在做的事情有一些误解,但我无法理解它.有人会向我解释这里发生了什么吗?
我正在使用gcc 8.0.1版

编辑:刚刚在gcc 4.8.1上测试过,并按预期使用return语句,没有编译错误.

它是编译器的东西吗?

这两种情况都是未定义的行为.

非void函数的行为缺少return语句是undefined(main()除外),这意味着一切皆有可能.即使你可能得到“正确”的结果,你也不应该依赖它.

当您添加return std :: move(n N);之类的return语句时,您尝试返回对temporary的引用,该引用始终是悬空的,并且取消引用它也会导致UB.

本文共计439个文字,预计阅读时间需要2分钟。

为什么c语言中lambda表达式不返回时会出现奇怪行为?

我发现了一些难以理解的东西。我认为它可能与函数栈和未定义的行为有关。假设我有一个功能工厂模板(一个简单的模板):

cpptemplatestd::function build_add_function(){ return [N](const int n) { return N + n; };}

我找到了一些无法理解的东西.我认为它应该与函数堆栈和一些未定义的行为有关.

假设我有一个功能工厂模板(傻一个):

template <unsigned int N=10> std::function<int&&(const int& n)> build_add_function() { return [](const int& n) -> int&& {std::move(n+N);}; }

如您所见,它缺少非void函数的return语句,因此编译器向我发出警告……
奇怪的是它“按预期”工作

为什么c语言中lambda表达式不返回时会出现奇怪行为?

int main() { auto foo = build_add_function(); std::cout << foo(10); }

主要产出:20

当然,为了修复代码,我添加了return语句,它给了我一个分段错误

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

我对我正在做的事情有一些误解,但我无法理解它.有人会向我解释这里发生了什么吗?
我正在使用gcc 8.0.1版

编辑:刚刚在gcc 4.8.1上测试过,并按预期使用return语句,没有编译错误.

它是编译器的东西吗?

这两种情况都是未定义的行为.

非void函数的行为缺少return语句是undefined(main()除外),这意味着一切皆有可能.即使你可能得到“正确”的结果,你也不应该依赖它.

当您添加return std :: move(n N);之类的return语句时,您尝试返回对temporary的引用,该引用始终是悬空的,并且取消引用它也会导致UB.