c++ - Nullptr - bool 赋值

标签 c++

为什么我们不能直接将 nullptr 赋给一个 bool 对象?例如,标志对象的赋值会导致错误。 Visual Studio 编译器给出:“C++ 类型的值不能分配给类型的实体”。

int main(){

    int x = 10;
    int *ptr = &x;
    bool flag = ptr;
    
    flag = nullptr; 

}

但以下版本工作正常。

int main(){

    int x = 10;
    int *ptr = &x;
    bool flag = ptr;
    ptr = nullptr;
    
    flag = ptr;

}

最佳答案

这有点棘手。我们必须仔细检查 C++ 标准。首先,“标准转化”指出:

  • 所有指针都隐式转换为 bool 值(根据 [conv.bool])

而这种转换只是将空指针转换为 false。所以看起来我们应该能够直接将空指针常量分配给 bool 值,对吧?

嗯,有点

请看,nullptr 的实际定义声明它是 std::nullptr_t 的一个实例,它是一个不同的类型,实际上不是指针类型。但是,它可以转换为指针类型! (根据 [lex.nullptr])。

仍然看起来应该是可能的,对吧? nullptr 可转换为指针类型,指针类型可转换为 bool 值。

但是,标准转换(返回 [conv])序列只能按特定顺序应用转换。此顺序仅允许 bool 值或指针转换之一。

因此,我们需要的两个转换不会隐式发生。我们必须明确地为编译器做其中之一。例如:

flag = static_cast<int*>(nullptr);

或者,可能更简单

flag = bool{nullptr}

或者更简单:

flag = {nullptr}

但到那时,您还不如使用 false :-)

关于c++ - Nullptr - bool 赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65401067/

相关文章:

c++ - GNU 链接器 : errors if pointer in header file is declared NULL and/or extern

c++ - 内存泄漏与否?

android - 将 JNI 用于 IOS 和 Android

c++ - 如何静态编译 wxwidgets 应用程序?

c++ - 理论或方向、c++、qt 和使用 MXE 进行交叉编译

c++ - 结构的 char* 成员被 strcmp 覆盖?

c++ - C++中的文件操作

c++ - 将对象声明放在循环中是否会降低性能?

c++ - 我需要解压缩/重新压缩一个文件,以便在我的 Windows 中的 C++ 中进行编辑

java - 为什么 C++ 需要通过 header 或语句进行前向声明,而 Java 不需要?