优先选择nullptr,而非0或NULL
字面常量0的类型是int
,而非指针。当c++在只能使用指针的语境中发现了一个0,它也会把它勉强解释为空指针。
c++的基本观点还是0的类型是int
,而非指针。
从实际效果来说,以上结论对NULL也成立。NULL在技术细节上有一些不清不楚的成分,因为标准允许各个实现给予NULL非int
的整数类型(如long)。
0和NULL都不具备指针类型。
c++98中,这样的基本观点可能在指针类型和整型之间进行重载时发生意外。
void f(int);
void f(bool);
void f(void*);
f(0); //调用的是f(int),而不是f(void*)
f(NULL); //可能通不过编译,但一般会调用f(int),从来不会调用f(void*)
不要在指针类型和整型之间做重载。
nullptr
的优点在于,它不具备整数类型,也不具备指针类型,它可以被认为是一种任意类型的指针。
nullptr
的实际类型是std::nullptr_t
,该类型可以隐式转换到所有的裸指针类型。
调用重载函数f时传入nullptr
会调用void*
那个重载版本,因为nullptr
无法被视作任何一种类型。
f(nullptr); //调用的是f(void*)这个重载版本
使用nullptr
而非0和NULL可以避免重载中的意外,也可以提升代码的清晰度,尤其在涉及到auto
变量时。
auto result = findRecord();
if(result == 0){
...
}
如果不知道findRecord()函数的返回值类型的话,那么result是指针类型还是整数类型就不清楚了。
如果看到是下面这段代码
auto result = findRecord();
if(result == nullptr)
{
...
}
这就没有多义性了。
要点速记
- 相对于0和NULL,优先选择
nullptr
- 避免在整型和指针类型之间重载