Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么允许将int-literal设置为指针,但不允许比较?_C++ - Fatal编程技术网

C++ 为什么允许将int-literal设置为指针,但不允许比较?

C++ 为什么允许将int-literal设置为指针,但不允许比较?,c++,C++,这是完整的代码。它是我自制的单元测试框架的一部分 #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

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

#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);
}

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

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

if (foo_p == 0) {}
如果要比较foo_p所指的值,必须执行以下操作:

if (*foo_p == 0) {}
编辑:

错误是您试图将指针与int变量进行比较:

ISO-C++禁止指针与整数[fPrime]

的比较

由于指针是一个结构,不能与int文本进行比较。

0在C++中是特殊的,除了作为int文字外,它也意味着空指针,因此可以将它赋值给指针,并将它与指针进行比较,例如:

Foo* pf = 0;
if (pf == 0) {}
顺便说一句,在c++11中最好使用nullptr而不是0

但是int和pointer是不同的类型,因此您不能直接分配或比较它们:

int i = 0;
Foo* pf = i;    // compile error
if (pf == i) {} // compile error
在您的例子中,T1是Foo*,T2是int,它们不能直接进行比较。

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

Foo* pf = 0;
if (pf == 0) {}
。。。但你不能使用


完全避免这个问题的最简单的方法是不使用0作为空指针文字,而是使用Null pTr.< /P>如果这对任何C++编译器都不起作用,编译器是错误的。您可能希望包括警告级别和使用的设置,以及可重复的完整代码示例,因为这应该工作。如果foo_p==0`是完全有效的;0是空指针常量。请复制并粘贴生成错误消息的确切代码行。答案是,您根本没有将指针与int文本进行比较,而是将其与int变量进行比较。我使用的是没有nullptr的C++03

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