C99和C++03空指针定义的区别

Difference in definition of null pointer in C99 and C++03

N2431是介绍nullptr的论文。它说:

The current C++ standard provides the special rule that 0 is both an integer constant and a null pointer constant. From [C++03] clause 4.10:

A null pointer constant is an integral constant expression (expr.const) rvalue of integer type that evaluates to zero. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that type and is distinguishable from every other value of pointer to object or pointer to function type. Two null pointer values of the same type shall compare equal. The conversion of a null pointer constant to a pointer to cv-qualified type is a single conversion, and not the sequence of a pointer conversion followed by a qualification conversion (conv.qual).

This formulation is based on the original K&R C definition and differs from the definition in C89 and C99. The C standard [C99] says (clause 6.3.2.3):

An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.[55] If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.

让我们忽略“[c++03] 公式基于原始 K&R C 定义”部分并关注“[c++03 公式] 与 [...] C99 中的定义不同”。

我不清楚 C++03 和 C99 的定义有何不同。是的,它们在书面标准中有不同的正式定义(正如我们可以看到引用不同),但从实际角度来看这意味着什么?他们真的不同吗?如果我没看错这篇文章,它的语气暗示着存在差异。如果有,它们是什么?我无法 comprehend/understand 基于标准引用的差异。

具体我不问C++03或C99空指针是怎么定义的,表示and/or实现。我的问题是关于 C++03 和 C99 空指针定义(以及它们的实现,如果这对于回答这个问题很重要)有何不同,答案可以包含 C++03 和 C++03 定义的解释和C99 空指针,但仅作为证明差异或缺乏差异的帮助点。也就是说,仅仅提供每一个的定义或者对定义的解释都不算是对这个问题的回答。

我完全知道 nullptr 是 C++11 及更高版本中表达空指针的首选方式。这不是问题。

在 C 中你有

An integer constant expression with the value 0, or such an expression cast to type void *

表示值为0(void*)0的整数常量是有效的空指针常量。

在 C++ 中你有

A null pointer constant is an integral constant expression (expr.const) rvalue of integer type that evaluates to zero

这意味着只有值为0的整数常量才是有效的空指针常量。

标准不允许 (void*)0 作为空指针常量的原因是 void* 不能转换为任何其他指针类型(除了 cv-qualified void*).在 C 中你可以做 void *p = 0; int *ip = p;。在 C++ 中,不允许隐式转换为 int*