nullptr 和 boolean 之间的比较

comparison between nullptr and boolean

在尝试使用空指针时,我尝试编写代码来检查指针是否为空:

#include <iostream>
using namespace std ;
int main(){
    int *p = 0;
    if(!p == true){
        cout<<"nullptr\n";
    }
    else{
        cout<< "no\n";
    }
    return 0;
}

工作正常,没有任何错误,但是当我尝试这个时(根据我的说法,这基本上是同一件事,但显然不是):

#include <iostream>
using namespace std ;
int main(){
    int *p = 0;
    if(p == false){
        cout<<"nullptr\n";
    }
    else{
        cout<< "no\n";
    }
    return 0;
}

我收到一个错误:“错误:ISO C++ 禁止比较指针和 整数 [-fpermissive]"


谁能告诉我这两个代码有何不同,为什么第二个代码会出错?

当您对指针 p 执行 ! 时,您会得到 truefalse 值,具体取决于 p 是否为 [=15] =] 或不。显然,比较2个bool就可以了。

当你做p == true时,左边仍然是一个指针,你不能比较指针和bools。

这与隐式显式转换的区别,以及bool类型的特殊状态有关关于显式转换。

通常,虽然您可以在整数和指针(任一方向)之间进行转换,但您只能显式 进行强制转换。没有转换意味着没有转换,你会得到一个错误。

这里的特殊例外来自bool类型的特殊处理和"boolean contexts"的特殊状态。基本上,有一些句法上下文:

  • ifwhilefor 语句的条件表达式操作数
  • ! 一元运算符的操作数
  • ?/: 三元运算符的第一个操作数
  • &&/||
  • 的操作数

是 "boolean contexts" -- 操作数必须是布尔值 -- 并且其他类型的操作数可以隐式转换为 bool 即使此类转换通常需要显式转换

这说明了为什么您的第一个示例有效——您使用的是一元 !,它是允许转换为 bool 的特殊布尔上下文之一,就好像存在显式强制转换一样。

这与指针没有什么特别的关系——同样的事情发生在任何用户定义的 (class) 类型上,该类型具有为其定义的 explicit operator bool 转换。