为什么我们不能直接将nullptr分配给bool对象?例如,标志对象的赋值会导致错误。Visual编译器给出了这样的结论:"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;
}发布于 2020-12-21 22:57:37
有点棘手。我们必须仔细检查C++标准。首先,“标准转换”规定:
这种转换只是将空指针转换为false。因此,我们应该能够直接将空指针常量赋值给布尔值,对吗?
嗯,算是吧。
请参阅,nullptr的实际定义表明它是std::nullptr_t的一个实例,这是一个不同的类型,实际上不是指针类型。但是,它可以转换为指针类型!(按lex.nullptr计算)
看起来应该是可能的,对吧?nullptr是可转换为指针类型的,而指针类型是可转换为布尔值的。
但是,标准转换(返回到conv)序列只能按特定顺序应用转换。此顺序只允许一个布尔值或指针转换。
因此,我们所需要的两个转换不会隐式发生。我们必须为编译器显式地执行其中之一。例如:
flag = static_cast<int*>(nullptr);或者,也许更简单
flag = bool{nullptr}或者更简单:
flag = {nullptr}但在这一点上,您最好只使用false :-)
https://stackoverflow.com/questions/65401067
复制相似问题