【发布时间】:2018-04-04 16:33:30
【问题描述】:
我正在尝试创建一个compose_all lambda,它接受一个函数向量,并返回一个函数,该函数是向量中所有函数的组合:
#include <algorithm>
#include <iostream>
#include <vector>
#include <functional>
using std::cout;
using std::endl;
using std::function;
using std::vector;
int main() {
vector<function<int(int)>> functions = {
[](int x) { return 2 * x; },
[](int x) { return x * x; },
[](int x) { return -x; },
};
function<function<int(int)>(
vector<function<int(int)>>::iterator,
vector<function<int(int)>>::iterator,
function<int(int)>)> compose_all;
compose_all = [&](vector<function<int(int)>>::iterator f_begin,
vector<function<int(int)>>::iterator f_end,
function<int(int)> f) -> function<int(int)> {
for (; f_begin < f_end; ++f_begin) {
f = [&](int x) { return (*f_begin)(f(x)); };
}
return f;
};
auto composition = compose_all(functions.begin(),
functions.end(),
[](int x) { return x; });
for (int i = 0; i < 10; ++i) {
cout << composition(i) << endl;
}
return 0;
}
虽然编译正常,但会出现段错误:
$ clang++ -std=c++11 -g composition.cpp && ./a.out
Segmentation fault (core dumped)
段错误的原因是什么,解决方法是什么?
使用打印语句和 GDB 进行调试的注意事项:
-
compose_all正确接收了迭代器 -
f = [&](int x) { return (*f_begin)(f(x)); };线上出现段错误 - 单独取消引用
f_begin会产生正确的结果(它在向量中调用正确的 lambda)
【问题讨论】:
标签: c++ c++11 lambda functional-programming higher-order-functions