c++ - nullptr和 bool 值之间的比较

标签 c++ nullptr

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

#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]“

谁能告诉我这两个代码有何不同?为什么我在第二个代码中出现错误?

最佳答案

这与隐式和显式转换之间的区别以及bool类型相对于显式转换的特殊状态有关。

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

这里的特殊异常(exception)来自对bool类型的特殊处理和“ bool(boolean) 上下文”的特殊状态。基本上,有一些语法上下文:

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

  • 这是“ bool(boolean) 上下文”(操作数必须是 bool(boolean) 值),并且其他类型的操作数也可能隐式转换为bool ,即使此类转换通常需要显式强制转换

    这说明了第一个示例为何起作用-您使用的是一元!,它是那些特殊的 bool(boolean) 上下文之一,它允许转换为bool,就好像存在显式转换一样。

    这与指针没有什么特别的关系-对于任何为其定义了explicit operator bool转换的用户定义的(类)类型,同样的事情也会发生。

    关于c++ - nullptr和 bool 值之间的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62250967/

    相关文章:

    c++: `this == nullptr` 在成员函数中安全吗?

    C++:当我将值分配给缓冲区时,它不起作用

    c++ - 无法更改 volatile 变量的值

    c++ - 实现 std::list 项读/写事件

    c++ - 为什么 `void* = 0` 和 `void* = nullptr` 会有所不同?

    c++ - 为什么 nullptr 是核心语言的一部分,而 nullptr_t 是 STL 的一部分?

    c++ - cpp 关于函数中的 map 引用

    c++ - Getline 没有得到输入

    C++11 清除shared_ptr时,我应该使用reset还是设置为nullptr?

    c++ - 新对象中的空函数指针实际上不是 nullptr