c++ - 不返回 lambda 奇怪的行为

标签 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)

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

编辑:刚刚在 gcc 4.8.1 上进行了测试,返回语句按预期工作,没有编译错误。

它是编译器的东西吗?

最佳答案

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

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

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

关于c++ - 不返回 lambda 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51892283/

相关文章:

c++ - 如何告诉 Visual Studio 使用不同的源代码目录来调试库?

c++ - 在 C++ 中使用链表处理文件

c++ - auto 作为常规函数中的参数是 GCC 4.9 扩展吗?

c++ - 如何让 C++ 从 lambda 推断模板类型参数?

python - 如何改进python后缀数组中的lambda表达式

c++ - 以这种方式使用 boost::asio::strand 是否安全?

c++ - 如何遍历二维数组?

linux - 如何存储已编译的脚本名称并执行它?(GCC)

GCC 4.6.0 构建健全性检查错误

ruby-on-rails - Rails Workflow Gem - 将事件元编程到named_scopes?