不可返回lambda奇怪的行为

时间:2018-08-17 09:24:55

标签: c++ gcc lambda 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);};
}

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

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

主要输出: 20

当然,要修复代码,我添加了return语句,这给了我分段错误

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

我对自己正在做的事情有一些误解,但我无法解决。有人可以告诉我这里发生了什么吗? 我正在使用gcc8.0.1

编辑:刚刚在gcc 4.8.1上进行了测试,并与return语句一起正常工作,没有编译错误。

这是编译器的东西吗?

1 个答案:

答案 0 :(得分:6)

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

缺少return的非无效函数的行为是undefinedmain()除外),这意味着一切皆有可能。即使您可能会得到“正确”的结果,也不应依赖它。

当您添加return之类的return std::move(n+N);语句时,您试图返回对临时对象的引用,该引用始终是悬挂的,并且对其的取消引用也会导致UB。