【问题标题】:Why do we have nullptr but not nullchar?为什么我们有 nullptr 而没有 nullchar?
【发布时间】:2020-11-01 20:50:59
【问题描述】:

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

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

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

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

【问题讨论】:

  • 有时'\0' 是一个有效字符。
  • '\0' 是一个非常有趣的char
  • 如果你愿意,你可以自己做!将其放在您的“全局”标题之一中:static inline constexpr char nullchar = '\0';.
  • @Enrico 完全可以接受。
  • 您能否在您的问题中举例说明为什么您认为 nullchar 是个好主意?我个人认为没有必要

标签: c++ pointers char nullptr


【解决方案1】:

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

【讨论】:

  • "在 C 中,void* 可以隐式转换为任何指针类型,所以这可以工作。" 不,它按定义工作。
  • 啊哈!指针具有不同类型的事实是我忽略的关键点。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
相关资源
最近更新 更多