【问题标题】:How to define our own nullptr in c++98?如何在c++98中定义我们自己的nullptr?
【发布时间】:2023-03-27 21:21:02
【问题描述】:

实际上,我正在编写自己的所有库类版本,并且我不想将 STL 文件包含到我的类文件中。 因此,例如,我想检查节点是否等于 null。 如果我写类似

#define nullptr 0

那么它不适用于其他一些节点指针(即Node *root = nullptr

【问题讨论】:

  • 这是c还是c++?如果是 c++ 则 nullptr 是关键字
  • 不要垃圾标签! C 不是 C++。而nullptr 是一个标准关键字,引入它是为了完全避免矛盾的0 转换。
  • 除非你可以添加你为什么需要这样做的动机,否则你会被否决:在语言中引入了 nullptr 以避免与零的意外混淆(通过 ADL 解析和隐式类型转换)。您提出的(定义)是危险的,并且是难以找到的错误来源。 (实际上,您在代码库中重新引入了 NULL 导致的错误,并且 nullptr 可以解决)。

标签: c++ nullptr


【解决方案1】:

如何做到这一点在书中提到:Effective C++, 2nd edition by Scott Meyers(有更新版本)在章节:“第 25 条:避免指针和数值类型上的重载。”。 p>

如果您的编译器不知道 C++11 引入的 nullptr 关键字,则需要它。

const                         /* this is a const object...     */
class nullptr_t
{
public:
   template<class T>          /* convertible to any type       */
   operator T*() const        /* of null non-member            */
      { return 0; }           /* pointer...                    */

   template<class C, class T> /* or any type of null           */
      operator T C::*() const /* member pointer...             */
      { return 0; }   

private:
   void operator&() const;    /* Can't take address of nullptr */

} nullptr = {};               /* and whose name is nullptr     */

那本书绝对值得一读。


nullptr 相对于NULL 的优势在于,nullptr 的作用类似于真正的指针类型,因此它增加了类型安全性,而 NULL 的作用类似于在 C++11 之前设置为 0 的整数。

【讨论】:

  • 你应该调用类型nullptr_t来保持一致
  • @PasserBy:谢谢!我更改了类名...但是 const 实例的名称永远不会少nullptr
【解决方案2】:

您不应使用关键字标识符来定义宏。

即使您不使用 STL,也无需定义自己的 nullptr,因为它不是 STL(也不是标准库)的一部分,而是 (C++) 语言本身的一部分。

【讨论】:

  • 这是真的,但 nullptr 仅在 C++11 中添加。也就是说,我认为这不是这个问题的意义所在。