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

时间:2018-01-26 12:04:25

标签: c++ visual-studio-2015 logical-operators delete-operator

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

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

在这里:

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

出了什么问题?

6 个答案:

答案 0 :(得分:6)

错误告诉你问题。 delete不会返回任何内容(并且它很可能DeleteNodeData也没有),因此它不能用作测试的一部分(因为测试必须有结果,即使你不使用它。)

将其更改为:

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

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

答案 1 :(得分:4)

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

您应该按如下方式重写代码:

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:3)

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

假设pNodeData->DeleteNodeData()也是void类型(根据其名称来判断),请考虑重构

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

请注意if条件中的声明:这在新的C ++标准中是允许的。

以前的编译器可能会错误地发出原始代码,但这从未成为标准C ++的一部分。

答案 4 :(得分:2)

关键字delete 返回void。 您正在使用bool评估void表达式。只有那里可以返回truefalse的表达式。

有关delete访问http://www.cplusplus.com/reference/new/operator%20delete/

的更多信息

答案 5 :(得分:1)

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

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