Ave*_*lia 3 c c++ c99 language-lawyer c++03
N2431是介绍的论文nullptr。它说:
当前的 C++ 标准提供了一个特殊规则,即 0 既是整数常量又是空指针常量。来自 [C++03] 条款 4.10:
空指针常量是整数类型的整数常量表达式 (expr.const) 右值,其计算结果为零。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且与指向对象的指针或指向函数类型的指针的所有其他值区分开来。相同类型的两个空指针值比较相等。将空指针常量转换为指向 cv 限定类型的指针是一次转换,而不是指针转换后跟限定转换 (conv.qual) 的序列。
此公式基于原始 K&R C 定义,与 C89 和 C99 中的定义不同。C 标准 [C99] 说(第 6.3.2.3 条):
值为 0 的整数常量表达式,或转换为 void * 类型的此类表达式,称为空指针常量。 [55] 如果将空指针常量转换为指针类型,则生成的指针(称为空指针)保证与指向任何对象或函数的指针不相等。
让我们忽略“[c++03] 公式是基于原始的 K&R C 定义”部分而关注“[c++03 公式] 与 [...] C99 中的定义不同”。
我不清楚 C++03 和 C99 定义在哪些方面有所不同。是的,它们在书面标准中有不同的正式定义(正如我们所看到的引用不同),但从实践的角度来看,这意味着什么?他们真的有区别吗?如果我正确阅读这篇文章,它的语气暗示存在差异。如果有,它们是什么?我无法理解/理解基于标准引用的差异。
我没有具体询问 C++03 或 C99 空指针是如何定义、表示和/或实现的。我的问题是关于 C++03 和 C99 空指针定义(可能还有它们的实现,如果为了回答这个问题而进行演示很重要)有何不同,答案可以包含 C++03 和C99 空指针,但仅作为说明差异或显示差异的帮助点。也就是说,仅提供定义或对每个定义的解释不被视为对这个问题的回答。
我完全知道这nullptr是在 C++11 及更高版本中表达空指针的首选方式。这不是问题。
标准不允许(void*)0作为空指针常量的原因是 avoid*不能转换为任何其他指针类型(除了 cv-qualified void*)。在 C 中你可以做到void *p = 0; int *ip = p;。在 C++ 中,int*不允许隐式转换为。