You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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,非空是true
  • pNodeData->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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:27:42