无回报的lambda奇怪的行为

Net*_*ave 3 c++ lambda gcc return c++14

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

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

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

正如你所看到的,它缺少非void函数的return语句,因此编译器向我发出警告......奇怪的是它"按预期"工作

int main() {
  auto foo = build_add_function();
  std::cout << foo(10);
}
Run Code Online (Sandbox Code Playgroud)

主要输出: 20

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

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
Run Code Online (Sandbox Code Playgroud)

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

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

它是编译器的东西吗?

son*_*yao 6

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

非void函数缺少return语句的行为是未定义的(除了main()),这意味着任何事情都是可能的.即使你可能得到"正确"的结果,你也不应该依赖它.

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