从CodeProject下载的2008旧项目编译报错:'&&'右操作数为void类型
分析C++编译错误:'&&': illegal, right operand has type 'void'
先看你遇到的场景:从CodeProject下载的2008年旧项目编译时卡在这里了:
while( hItem_i ) { PINodeData pNodeData = GetItemData( hItem_i ); pNodeData && pNodeData->DeleteNodeData() && delete pNodeData; //报错行 .... }
错误原因很直接:
C++里的逻辑运算符&&(逻辑与)有个硬性要求:它的左右操作数必须是能转换成布尔值的表达式,简单说就是每个操作都得有“返回值”可以用来判断真假。
但你看报错行里的几个操作:
pNodeData:这是指针,没问题,空指针会转成false,非空是truepNodeData->DeleteNodeData():这个函数返回的是void——也就是没有返回值,根本没法转换成布尔值参与逻辑运算delete pNodeData:同样,delete操作本身也是void类型,也不能参与&&运算
那为啥2008年的旧代码可能当时能编译?大概率是当年某些编译器(比如老版本的VC++)有非标准的扩展,允许这种“把void操作当成true”的写法,但现在的编译器都严格遵循C++标准了,所以就报错了。
怎么修正?
这段代码的本意应该是:如果pNodeData不为空,就先调用DeleteNodeData()清理内部资源,再释放指针本身。那直接把逻辑拆成顺序执行的判断和操作就行,别用&&硬凑:
while( hItem_i ) { PINodeData pNodeData = GetItemData( hItem_i ); if (pNodeData) { //先判断指针是否有效 pNodeData->DeleteNodeData(); //执行清理 delete pNodeData; //释放内存 } .... }
这样既符合标准C++语法,逻辑也更清晰,不会有歧义。
内容的提问来源于stack exchange,提问作者Nika_Rika
相关产品推荐
相关产品推荐

