假设我有一个指针
MyType *ptr;
当用旧标准检查"truth-value context"中指针的有效性时,我会写这样的东西
if (ptr) { ... // 1
while (ptr) { ... // 2
事实是,在这样的"真值环境中"我们期望将指针隐式转换为布尔值,所以我们几乎要比较
if (NULL != ptr) { ...
while (NULL != ptr) { ...
然而,弃用了与整数0
的宏进行比较,C ++ 11建议与nullptr
进行比较。
在真实价值背景下,虽然像上面的(1)或(2)那样我们没有明确说出
if (nullptr != ptr) { ...
while (nullptr != ptr) { ...
我们的指针比较什么?它转换为布尔值? 我们是否必须明确地与nullptr
进行比较?
答案 0 :(得分:5)
if
语句的条件(如果是表达式)从上下文转换为bool
:
[stmt.select] / 4关于选择陈述中的条件(if
,switch
):
作为表达式的条件的值是的值 表达式,对
bool
以外的语句进行上下文转换为switch
;如果这种转换形成不良,那么该计划就会形成不良。
在[转化] / 3中将语境转换为bool
的定义如下:
表达式
e
可以隐式转换到类型T
当且仅当声明T t=e;
格式正确时,对于某些发明的临时变量t
。某些语言结构要求表达式为 转换为布尔值。出现在这样的上下文中的表达式e
被称为在上下文中转换为bool
,并且当且仅当声明bool t(e);
格式正确时才是格式良好的,对于某些发明的临时变量t
。
以下是基本类型转换为bool
的说明[conv.bool] / 1:
算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为a
bool
类型的prvalue。零值,空指针值或空成员指针值将转换为false
; 任何其他值都将转换为true
。类型std::nullptr_t
的prvalue可以转换为prvalue 输入bool
;结果值为false
。
因此,当我们测试指针if(ptr)
时,我们将ptr
与该类型的空指针值进行比较。什么是空指针值? [conv.ptr] / 1
空指针常量是求值为的整数类型的整数常量表达式prvalue 零或
std::nullptr_t
类型的prvalue。空指针常量可以转换为指针类型;该 result是该类型的空指针值,并且可以与对象指针的每个其他值区分开来 函数指针类型。这种转换称为空指针转换。两个空指针值 相同类型应相等。
这也描述了我们比较if(ptr != nullptr)
时会发生什么:nullptr
被转换为ptr
的类型(参见[expr.rel] / 2),并产生该类型的空指针值。因此,比较等效到if(ptr)
。
答案 1 :(得分:1)
我们说你有:
int* ip = foo();
if ( nullptr == ip )
{
}
好像你在说:
int* ip = foo();
if ( (int*)0 == ip )
{
}
此时,您正在比较两个相同类型的指针。
这是我在cppreference.com
找到的<强>解释强>
关键字nullptr表示空指针文字。它是std :: nullptr_t类型的未指定的prvalue。存在从nullptr到任何指针类型的空指针值以及指向成员类型的任何指针的隐式转换。类似于std :: nullptr_t的任何值以及宏NULL(空指针常量)都存在类似的转换。