为什么我们有 nullptr 但没有 nullchar?

Why do we have nullptr but not nullchar?

我的理解——而且我确定我即将学习——是 nullptr 被添加到 C++ 中以形式化约定,即指针的零值意味着指针不指向有效对象。是否有理由支持(或反对)添加相应的 nullchar 来形式化约定,即 char 的零值意味着 char 不是有效字符,而是字符串的终止符?我可以看出这两种情况的一些共同点:

类型安全:0 可以有几种不同的类型,因此很容易错误地将非指针变量赋值给零,而不是你想要的指针变量。如果你做得恰到好处,也很容易调用错误的重载函数。拥有一个特殊的强类型值可以防止这种错误,这对于 char 类型也是如此。

表达能力:将变量赋值为 nullptr 可以让 reader 清楚地知道该变量是一个指针(因为只能将指针赋给该值)并且它指向没有对象。将字符分配给 nullchar 会增加同样的清晰度和可读性。

还有更多内容,但我相信您已经明白了。那为什么我们有 nullptr 但没有 nullchar

不,因为没有那么多理由,真的。添加 nullptr 是为了消除对 NULL 宏的需要,它在 C 中被定义为类似 (void*)0 的东西。在 C 语言中,void* 可以隐式转换为任何指针类型,所以这行得通。然而,这在 C++ 中并非如此,它删除了这种隐式可转换性(但不是它的逆,从任何指针类型到 void*),以提高类型安全性。然而,C++ 仍然希望有一种简单的方法使任何指针成为空指针,这就是引入 nullptr_t 的原因,它可以隐式转换为任何指针类型,如 void* 曾经是,但只能包含空指针值 nullptr。在 C++ 中,你可以用 '[=18=]' 表示一个空字符,没有类型歧义或不必要的显式转换,所以没有理由使用 nullchar 值,这也会占用另一个有价值的保留标识符(标准委员会真的很喜欢保留那些。)