NULL和nullptr之间的比较

6

当一个指针是 NULL,另一个指针是 nullptr 时,进行比较是否安全?这种比较会始终返回 true 吗?

2个回答

5

是的。

NULLnullptr都是"空指针常量"

空指针常量可以转换为指针类型;结果是该类型的空指针值,并且与任何对象指针或函数指针类型的其他值都不同。

最后,

相同类型的两个空指针值应相等。

(引用N4140中4.10/1的两篇引用)


只是提醒一下,所有指针类型共享同一个“nullptr”。 - amirfg
如果我比较 (nullptr == NULL),我会在clang中得到错误:error: comparison between NULL and non-pointer ('std::nullptr_t' and NULL) [-Werror,-Wnull-arithmetic] - undefined
@mirabilos 这是将NULL字面值与nullptr进行比较,与此处讨论的情况不同:比较两个指针,其中一个被赋值为NULL,另一个为nullptr。重要的区别是,在C++中,NULL通常不是一个指针。 - undefined
@BaummitAugen 但编译器抱怨的不是NULL不是指针,而是nullptr不是一个指针。(但是Fedi上的某人帮助我,将其中一个转换为void *可以解决这个问题。) - undefined
@mirabilos 当然,这个问题是关于比较指针的,你的情况是比较空指针常量。正如你所发现的,空指针常量并不是指针,所以这个答案不适用于你的情况。通过将至少一个空指针常量强制转换为指针,你将改变你的情况,变成了指针比较。 - undefined
@BaummitAugen 好的,那么让我困惑的是 CFrustFrust 部分,关于空指针常量不是指针的问题。这对我来说完全没有意义,但是,唉,如果这是委员会决定的,那就这样吧。 - undefined

2
假设通过 #define 或整型定义 NULL 等于 0,那么是的。

在C++中,标准的NULL始终为某种整数类型的0 - Cheers and hth. - Alf
1
从C++11开始,它也可以是类型为std::nullptr_t的prvalue。 - Baum mit Augen
@Cheersandhth.-Alf,有趣。我从C++标准中得到的是:在此国际标准中,宏NULL是实现定义的C++空指针常量。考虑一下,这意味着必须像你所说的那样。 - Paul Evans
1
“空指针常量是一个整数字面值,其值为零或类型为std :: nullptr_t的prvalue。”另请参见N4140中的4.10 / 1。 - Baum mit Augen
@BaummitAugen 谢谢,这样就把一切都联系起来了。 - Paul Evans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接