条款8:优先选用nullptr,而非0或NULL

字面常量0的类型是int而非指针,当C++在只能使用指针的语境中发现一个0,它也会把它勉强解释为空指针。C++的基本观点还是0的类型为int,而非指针;从实际效果来说,以上结论对于NULL也成立(标准允许各个实现给予NULLint的整数类型(如long))。

C++98中,这样的基本观点可能在指针和整形之间i进行重载时可能会发生意外。

void f(int);
void f(bool);
void f(void *);

f(0);	// 调用f(in)
f(NULL);// 可能会通不过编译,但一般会调用f(int)

f(NULL)的不确定性是NULL的类型在实现中的余地的一种反映。比如,假设NULL的定义为0L,那么f(NULL)调用就有多意性了。因为从longint,从longbool,还有从0Lvoid *的类型转换被视为同样好的。指导原则是不要在指针类型和整型之间做重载
nullptr的优点在于、它不具备整型类型。也不具备指针类型,但你可以把它想成一种任意类型的指针;
调用重载函数f时传入nullptr会调用void*那个重载版本,因为nullptr无法视作任何一种类型

f(nullptr);	//调用的是f(void*)这个重载版本

使用nullptr而非0NULL就避免了重载决议中的意外,也提升了代码的清晰性,尤其在在涉及auto变量时:

auto result = finRecord(/*实参*/)
if (result == 0) {
//...
}

如果你刚好不知道findeRecord的返回值类型的话,那么result是指针类型还是整数类型就不清楚了;但是如果你看到的是下面这段代码:

auto result = finRecord(/*实参*/)
if (result == nullptr) {
//...
}

这里没有多义性了:result必然具备指针类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值