Lambda表达式中使用Callable struct编译报错求助
编译错误排查与修复
咱们先拆解代码里的几个问题,逐个解决:
1. main函数缺少返回类型
C++标准要求main函数必须显式声明返回类型为int,你的代码里main()没有指定返回类型,这会触发编译错误。
2. Lambda表达式的const上下文冲突
你的lambda是值捕获handler,而lambda默认是const的(即lambda的operator()是const成员函数),但A::operator()是非const成员函数,在const上下文中无法调用非const成员函数,这是核心编译错误点。
另外,如果你希望修改原始的handler对象的error成员,值捕获只会修改副本,所以应该改用引用捕获&handler。
修正后的完整代码
#include <iostream> #include <system_error> #include <functional> struct A { A() : error() {} void operator()(const std::error_code& ec) { error = ec; std::cout << "hello world" << std::endl; } std::error_code error; }; int main() { // 补充int返回类型 auto handler = A(); std::error_code ec = std::error_code(); // 改用引用捕获&handler,操作原始对象而非副本 auto func = [&handler](const std::error_code& ec) { handler(ec); // 可根据需求传递传入的ec或默认构造的error_code }; func(ec); return 0; // 显式返回0,符合C++标准规范 }
关键修改点说明
- 给
main函数添加int返回类型,并在末尾添加return 0;(虽然部分编译器允许省略,但标准要求显式返回)。 - 将lambda的捕获方式从值捕获
handler改为引用捕获&handler:这样lambda内部操作的是原始的handler对象,同时避免了const上下文调用非const成员函数的问题。如果坚持要用值捕获,需要给lambda加上mutable关键字,让lambda的operator()变为非const,示例如下:
但这种情况下修改的是auto func = [handler](const std::error_code& ec) mutable { handler(std::error_code()); };handler的副本,原始对象的error不会被改变,请根据你的实际需求选择合适的捕获方式。
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

