如何在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 的整数。
实际上我正在编写我自己的所有库 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 的整数。