typedef定义的function类型变量赋值NULL时VS2015编译失败如何解决
错误原因
该编译错误由VS2015(VC14)对std::tr1::function的实现逻辑和其他编译器的差异导致:
NULL本质是展开为整型值0的宏,并非标准的空指针类型- VS2015的
std::tr1::function赋值运算符重载优先级设计存在缺陷:当传入整型的NULL时,编译器会优先匹配可调用对象的模板重载,而非空指针特化分支,最终触发std::invoke尝试对整型值做调用操作的模板特化失败报错。其他编译器或其他版本VS对function赋值NULL的场景做了特殊兼容处理,因此可以正常编译。
解决方案
以下方案均可以解决该兼容性问题,优先级从高到低排列:
- 替换
NULL为C11标准空指针标识nullptr,代码改为pOnRun = nullptr;。该写法符合C标准规范,所有支持C++11的编译器都能正常编译,无兼容性问题。 - 显式构造空的
OnRun对象赋值:pOnRun = OnRun();,兼容所有C++版本。 - 调用
function自带的清空方法:pOnRun.clear();,语义明确无歧义。 - 若必须保留
NULL写法,增加显式类型转换:pOnRun = static_cast<OnRun>(NULL);,强制编译器走空function构造分支。
内容的提问来源于stack exchange,提问作者wsy
相关产品推荐
相关产品推荐

