如何在c++98中定义我们自己的nullptr?

How to define our own nullptr in c++98?

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

#define nullptr 0

然后它不能与其他一些节点指针一起工作(即Node *root = nullptr

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

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

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

如果您的编译器不知道 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 的整数。