使用std::function报error C2064:项不计算为接受0参函数的原因
error C2064(std::function使用场景)报错原因
这个错误的核心触发逻辑是:代码尝试对一个不支持0参数调用的实体执行了无参()调用操作,结合std::function的使用场景,常见触发原因如下:
- 签名不匹配:定义的
std::function模板参数要求是0参可调用对象(比如std::function<void()>、std::function<int()>),但实际存入的可调用对象(普通函数、lambda表达式、bind绑定结果、重载了()的仿函数)需要传入1个或多个参数,后续直接无参调用时就会触发报错。
错误示例:#include <functional> #include <iostream> // 函数需要1个int类型入参 void log_msg(int level) { std::cout << "log level: " << level << std::endl; } int main() { // 错误:log_msg需要1个参数,和0参的function签名不匹配 std::function<void()> task = log_msg; task(); // 无参调用触发C2064 return 0; } - 存入了非可调用实体:赋值给
std::function的不是可调用对象,而是普通变量、数据成员、或者可调用对象执行后的返回值(非函数类型),后续调用时自然无法执行0参调用。
常见错误场景:- 给lambda/函数误加了括号,把调用后的返回值存入了function,比如
std::function<void()> f = [](){ /*逻辑*/ }();,这里f存的是lambda调用后的void返回值,不是lambda本身 - 绑定类成员时,误绑定了普通数据成员而非成员函数,比如把类的int类型成员绑定给0参function,调用时就会报错
- 给lambda/函数误加了括号,把调用后的返回值存入了function,比如
- 调用方式错误:如果
std::function存储的是类非静态成员函数,没有提前绑定类实例、也没有补全隐式的this参数,直接无参调用也会触发同类错误。
排查方法
- 第一步核对
std::function的模板签名,和存入的可调用对象的参数列表、返回值是否完全匹配,0参function仅能存储不需要传入任何调用参数的可调用对象 - 检查赋值表达式,确认没有给可调用对象误加
()提前执行,导致存入的是返回值而非可调用实体 - 绑定类成员时,确认绑定目标是成员函数而非数据成员,同时通过
std::bind或lambda正确绑定类实例,补全所有固定入参

内容的提问来源于stack exchange,提问作者WooSub Shin
相关产品推荐
相关产品推荐

