C++,'&&':非法,右操作数的类型为 'void'

C++ , '&&': illegal, right operand has type 'void'

我从 c​​odeproject 下载了一个旧项目 (2008),现在我正在尝试编译它,结果出现了这样的错误:

'&&': illegal, right operand has type 'void'

在这里:

    while( hItem_i )
    {
        PINodeData pNodeData = GetItemData( hItem_i );
        pNodeData && pNodeData->DeleteNodeData() && delete pNodeData; //HERE!!!
....
     }

怎么了?

错误告诉你问题所在。 delete 没有 return 任何东西(而且很可能 DeleteNodeData 也没有),所以它不能用作测试的一部分(因为测试 必须有一个结果,即使你不使用它)。

改为:

if (pNodeData) {
    pNodeData->DeleteNodeData();
    delete pNodeData;
}

这是这里的实际逻辑(如果您有指针,请清理它)。

关键字delete return 一个 void。 您正在使用 void 计算 bool 表达式。那里只有 return truefalse 的表达式是可能的。

有关 delete 的更多信息,请访问 http://www.cplusplus.com/reference/new/operator%20delete/

我不认为这是有效的 c++。它可能只是在某个时候起作用,因为编译器通常会允许非标准行为。删除不会 return 任何东西,所以它怎么能在需要两个值可转换为 bool 的 && 表达式中工作。为什么不把它改成这样...

if(pNodeData)
{
    pNodeData->DeleteNodeData();
    delete pNodeData;
}

您下载的代码在 pNodeDatanullptr 时使用短路黑客来跳过操作。不幸的是,这被打破了,因为 delete 运算符的结果类型为 void。它可能在过去通过利用编译器的缺点而起作用,但它始终是非标准的,应该避免。

你应该重写代码如下:

if (pNodeData) {
    pNodeData->DeleteNodeData();
    delete pNodeData;
}

delete pNodeData 是一个 void 类型的表达式,因此它不能用作 &&.

的参数

假设 pNodeData->DeleteNodeData() 也是一个 void 类型(从它的名字判断它可能是),考虑重构为

if (PINodeData pNodeData = GetItemData(hItem_i)){
    pNodeData->DeleteNodeData();
    delete pNodeData;
}

注意 if 条件语句中的声明:新的 C++ 标准允许这样做。

以前的编译器可能错误地发出了原始代码,但这从来都不是标准 C++ 的一部分。

虽然 if 肯定更好,但您 可以 使用 &&:

pNodeData && pNodeData->DeleteNodeData() && (delete pNodeData, 1);