为什么我们不能直接将nullptr分配给布尔对象?例如,标志对象的赋值会导致错误。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
:-)