C++类构造函数为什么不接受带捕获的lambda作为函数指针参数?
错误原因
C++ 中只有没有捕获任何变量的lambda才可以隐式转换为同签名的普通函数指针。你在给D成员传参时使用的lambda通过[=]捕获了局部变量Char,无法匹配构造函数要求的State (*Dp)(State, int)函数指针类型,因此触发构造函数不匹配的报错。
同时你编写的转换函数lambda存在逻辑漏洞:没有处理qi != 0场景的返回值,编译后运行会触发未定义行为。
修复方案
推荐将类内的函数指针替换为std::function,它支持存储带捕获的lambda,修改步骤如下:
- 引入头文件:
#include <functional>
- 修改DFA类的定义,将函数指针成员和构造函数参数替换为
std::function类型:
template <typename State> class DFA { public: DFA(std::function<bool(State)> Qp, State q0p, std::function<State(State, int)> Dp, std::function<bool(State)> Fp, int charp): Q(Qp), q0(q0p), D(Dp), F(Fp), Char(charp) {}; std::function<bool(State)> Q; State q0; std::function<State(State, int)> D; std::function<bool(State)> F; int Char; };
- 修改
acceptSingleton函数,补全lambda的返回逻辑:
DFA<int>* acceptSingleton(int Char) { DFA<int>* singleton = new DFA<int>( [](int x) { return x == 0 || x == 1 || x == 2; }, 0, [=](int qi, int c) { if (qi == 0) { return c == Char ? 1 : 2; } // 非初始状态保持原有状态即可 return qi; }, [](int qi) { return qi == 1; }, Char ); return singleton; }
额外优化建议
你当前使用裸指针返回DFA实例容易出现内存泄漏,建议直接返回DFA<int>对象而非指针,避免手动管理内存的额外开销。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

