为什么允许将int literal设置为指针,而不允许compare

Why set int literal to a pointer is allowed, but compare is not?

本文关键字:指针 不允许 compare 设置 int literal 为什么      更新时间:2023-10-16

这是完整的代码。它是我自制的单元测试框架的一部分。

#include <iostream>
#define IS(arg1, arg2) is(arg1, arg2, #arg1 " == " #arg2)
template<typename T1, typename T2>
void is(T1 value, T2 expect, const char* desc)
{
    if (value == expect)
    {
        std::cout << "ok " << " - " << desc << std::endl;
    }
    else
    {
        std::cout << "NOT ok " << " - " << desc << std::endl
                  <<"  got " << value <<", expect "<< expect << "  " << std::endl;
    }
}
struct Foo
{};
int main(int argc, char** argv)
{
    Foo* foo = 0;
    IS(foo, 0);
}

编译器会声称:

test.cpp:8:15: error: comparison between pointer and integer ('Foo *' and 'int')
    if (value == expect)
        ~~~~~ ^  ~~~~~~

是因为指针和int变量之间发生了实际的比较吗?

文字0是指针或整数文字,具体取决于它的使用方式。当0被分配或与指针进行比较时,它被认为是指针文字。在其他上下文中,例如,当在模板中推导其类型时,它被推导为int,并且它与指针不兼容。也就是说,你可以使用

Foo* pf = 0;
if (pf == 0) {}

但是您不能使用

auto null = 0;
Foo* pf = null;    // ERROR
if (pf == null) {} // ERROR

完全避免这个问题的最简单方法是而不是对空指针文字使用0,而是使用nullptr

也许您没有显示您当前正在做的事情,这就是为什么您应该按照WhozCraig的指示提供您正在使用的警告级别和设置。也许你想比较foo_p所指的值,这可能是一个陷阱,因为你实际上是在将地址与进行比较

if (foo_p == 0) {}

如果要比较foo_p所指的值,必须执行以下操作:

if (*foo_p == 0) {}

编辑:

错误是您试图将pointerint变量进行比较:

ISO C++禁止在指针和整数之间进行比较[-fpermission]

由于您的指针是struct,因此无法与int文字进行比较。

0在C++中是特殊的,除了作为int文字外,它还意味着null指针,因此您可以将其分配给指针,并将其与指针进行比较,例如:

Foo* pf = 0;
if (pf == 0) {}

顺便说一句,最好使用nullptr而不是c++11中的0

但是int和指针是不同的类型,所以你不能直接分配或比较它们:

int i = 0;
Foo* pf = i;    // compile error
if (pf == i) {} // compile error

在您的情况下,T1Foo*T2int,它们不能直接比较。