在 C++ 中使用模板组合函数出现分段错误

Compose functions with template in C++ got segmentation fault

我正在尝试编写一个演示,将各种函数链接成一个,就像 chain(f, g)(x) = g(f(x)),当我链接 lambda 时没问题,但是对于命名函数,我遇到了分段错误,我是现在正在努力。

我的代码:

template <typename F, typename G>
constexpr auto chain(F&& f, G&& g) {
  return [&](auto x) {
    return g(f(x));
  };
}

template <typename F, typename... Fs>
constexpr auto chain(F&& f, Fs&&... fs) {
  return chain(f, chain(fs...));
}

int add1(int x) {
  return x + 1;
}

int times2(int x) {
  return x * 2;
}

int add10(int x) {
  return x + 10;
}

int main(int argc, char* argv[]) {
  auto f = chain(
      [](int x) { return x + 1; },
      [](int x) { return x * 2; },
      [](int x) { return x + 10; });
  printf("result: %d\n", f(2)); // Here is OK
  auto g = chain(add1, times2, add10);
  printf("result: %d\n", g(2)); // Here I got a segmentation fault and I don't know why
  return 0;
}

您的非可变 chain 函数模板 return 是一个通过引用捕获参数 fg 的 lambda。当您从 chain return 并且调用 returned lambda 会调用未定义的行为时,这些引用是悬空的。

与未定义行为的情况一样,它有时看起来有效,但有时会导致分段错误。当然不能保证这种行为。