为什么我们有nullptr而没有nullchar? 我的理解——我确信我即将学习——是将 NulLPTR < /C> >添加到C++中,使指针的零值意味着指针不指向有效对象的约定形式化。是否有理由(或反对)添加一个相应的nullchar,以使字符的零值表示该字符不是有效字符,而是字符串的终止符的约定形式化?我可以看到这两个案例有几个共同点:

为什么我们有nullptr而没有nullchar? 我的理解——我确信我即将学习——是将 NulLPTR < /C> >添加到C++中,使指针的零值意味着指针不指向有效对象的约定形式化。是否有理由(或反对)添加一个相应的nullchar,以使字符的零值表示该字符不是有效字符,而是字符串的终止符的约定形式化?我可以看到这两个案例有几个共同点:,c++,pointers,char,nullptr,C++,Pointers,Char,Nullptr,类型安全:0可以有几种不同的类型,因此很容易错误地将非指针变量指定为零,而不是指定的指针变量。如果正确地调用了重载函数,也很容易调用错误的重载函数。使用特殊的强类型值可以防止这种错误,对于char类型也是如此 表达性:将变量指定为nullptr可以让读者清楚地知道变量是指针(因为只有指针可以指定给该值),并且它不指向任何对象。将字符分配给nullchar将增加同样的清晰度和可读性 还有很多,但我相信你会明白的。那么为什么我们有nullptr而没有nullchar?没有,因为没有那么多的理由nul

类型安全:
0
可以有几种不同的类型,因此很容易错误地将非指针变量指定为零,而不是指定的指针变量。如果正确地调用了重载函数,也很容易调用错误的重载函数。使用特殊的强类型值可以防止这种错误,对于
char
类型也是如此

表达性:将变量指定为
nullptr
可以让读者清楚地知道变量是指针(因为只有指针可以指定给该值),并且它不指向任何对象。将字符分配给
nullchar
将增加同样的清晰度和可读性


还有很多,但我相信你会明白的。那么为什么我们有
nullptr
而没有
nullchar

没有,因为没有那么多的理由<添加code>nullptr是为了消除对
NULL
宏的需要,该宏在C中被定义为类似
(void*)0
。在C语言中,
void*
可以隐式转换为任何指针类型,因此这是可行的。然而,C++中的情况并不是这样,它消除了隐式的可兑换性(但不是它的逆,从任何指针类型到 Value*/Cuff>),以增加类型安全性。然而,C++仍然希望有一种简单的方法来使任何指针成为空指针,这就是为什么代码“> NulpPrtRt被引入,它可以被隐式转换为任何一种指针类型,例如“代码> Value*/Cuth>”,但只能包含空指针值,<代码> nulLPTR < /C>。在C++中,可以用“代码>”0’< /CODE表示空字符,没有类型歧义或不必要的显式转换,因此没有理由使用<代码> Null Char < /Cord>值,这也将占用另一个有价值的保留标识符(标准委员会确实喜欢保留这些标识符)。

有时
'\0'
是一个有效字符。
'\0'
是一个非常复杂的
字符。如果您愿意,您可以自己制作!将其放在一个“全局”标题中:
static inline constexpr char nullchar='\0'
@Enrico完全可以接受。你能在问题中举例说明为什么你认为空字符是个好主意吗?我个人不认为有必要“在C中,void*可以隐式转换为任何指针类型,所以这是可行的。”不,它可以根据定义工作。啊哈!指针有不同类型的事实是我忽略的关键点。谢谢