检查真值环境中的空指针

Nik*_*iou 2 c++ pointers c++11

让我们说我有一个指针

MyType *ptr;
Run Code Online (Sandbox Code Playgroud)

当用旧标准在"真值 - 值上下文"中检查该指针的有效性时,我会写这样的东西

if (ptr)    { ... // 1
while (ptr) { ... // 2
Run Code Online (Sandbox Code Playgroud)

问题在于,在这样的"真值上下文"中,我们期望将指针隐式转换为布尔值,因此我们将进行比较

if (NULL != ptr)    { ...
while (NULL != ptr) { ...
Run Code Online (Sandbox Code Playgroud)

然而,0弃用了与整数的宏进行比较,C++ 11建议进行比较nullptr.

在真值期间的情况下,如上面的(1)或(2),我们没有明确说

if (nullptr != ptr) { ...
while (nullptr != ptr) { ... 
Run Code Online (Sandbox Code Playgroud)

什么是我们的指针比较?它转换为布尔值?我们必须明确地比较nullptr吗?

dyp*_*dyp 5

if语句的条件(如果它是表达式)在上下文中转换为bool:

[stmt.select]/4关于选择语句中的条件(if,switch):

作为表达式的条件的值是表达式的值,上下文转换bool为除以外的语句switch; 如果转换形成不良,该计划就是格式错误.

上下文转换为bool [conv]/3中定义如下:

对于某些发明的临时变量,当且仅当声明格式正确时,表达式才e可以隐式转换为类型.某些语言结构要求将表达式转换为布尔值.出现在这样的上下文中的表达被称为在上下文中被转换为并且当且仅当声明格式良好时,对于一些发明的临时变量而言是良好形成的.TT t=e;teboolbool t(e);t

以下是bool基本类型[conv.bool]/1 的转换说明:

算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为类型的prvalue bool.将零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true.类型std::nullptr_t的prvalue可以转换为类型的prvalue bool; 结果值是false.

因此,当我们测试指针时if(ptr),我们将比较该类型ptr空指针值.什么是空指针值?[conv.ptr]/1

空指针常数是整数类型的整数表达式prvalue计算结果为零或类型的prvalue std::nullptr_t.空指针常量可以转换为指针类型; 结果是该类型的空指针值,并且可以与对象指针或函数指针类型的每个其他值区分开.这种转换称为空指针转换.相同类型的两个空指针值应相等.

这也描述了我们比较时会发生什么if(ptr != nullptr):nullptr转换为ptr(参见[expr.rel]/2)的类型,并产生该类型的空指针值.因此,比较等同if(ptr).