Nullptr-布尔赋值

为什么我们不能直接将 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++ 标准。首先,“标准转换”指出:

  • 所有指针都隐式转换为布尔值(每个 [conv.bool])

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

嗯,有点

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

看起来还是应该有可能吧?nullptr可转换为指针类型,指针类型可转换为布尔值。

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

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

flag = static_cast<int*>(nullptr);

或者,可能更简单

flag = bool{nullptr}

或者更简单:

flag = {nullptr}

但在这一点上,你不妨使用false🙂


以上是Nullptr-布尔赋值的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>