在 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 是一个通过引用捕获参数 f
和 g
的 lambda。当您从 chain
return 并且调用 returned lambda 会调用未定义的行为时,这些引用是悬空的。
与未定义行为的情况一样,它有时看起来有效,但有时会导致分段错误。当然不能保证这种行为。
我正在尝试编写一个演示,将各种函数链接成一个,就像 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 是一个通过引用捕获参数 f
和 g
的 lambda。当您从 chain
return 并且调用 returned lambda 会调用未定义的行为时,这些引用是悬空的。
与未定义行为的情况一样,它有时看起来有效,但有时会导致分段错误。当然不能保证这种行为。