为什么允许将int literal设置为指针,而不允许compare
Why set int literal to a pointer is allowed, but compare is not?
这是完整的代码。它是我自制的单元测试框架的一部分。
#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) {}
编辑:
错误是您试图将pointer
与int
变量进行比较:
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
在您的情况下,T1
是Foo*
,T2
是int
,它们不能直接比较。
相关文章:
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- ctypes 不允许多次取消对指针的引用
- 为什么我们不允许将纯引用参数传递给 std::thread,但允许传递原始指针?
- 静态强制转换允许转换对象指针,但不允许转换整数
- AActor *UactorComponent::GetOwner const - 不允许指向不完整类类型的指针
- 方法中不允许访问结构指针
- 虚幻引擎 4.18.0,VS2017,不允许指向不完整类类型的错误指针
- 分部模板类中不允许指向不完整类类型的指针
- 描述为什么不允许在C++中将基类指针转换为派生类指针
- 为什么不允许虚方法返回 void 指针
- 错误:不允许指向不完整类类型的指针.我该怎么做
- 不允许指向不完整类类型的指针
- 为什么允许将int literal设置为指针,而不允许compare
- 错误:不允许指向不完整类类型的指针
- 不允许指向不完整类类型的指针.(与相互引用的类相结合.)
- 为什么不允许使用this的指针作为函数的默认参数
- 在ARC中不允许对Objective-C指针进行隐式转换
- 使用类类型的向量进行前向声明——不允许指向不完整类类型的指针
- 不允许成员函数的非指针类型定义
- 在尝试创建指针数组时,不允许使用不完整类型