<Effective Mordern C++>笔记:Item 8:prefer nullptr to 0 and NULL.

虽然如果C++看到一个指针类型被定义为0,它会把0解析为一个空指针,但是0终究只是个int类型并不是个指针。
NULL也是一样的,它也被允许解析为非int型的整形,但不是一个指针类型。
在一些接受不同参数类型的重载函数中,如下:

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

f(0); // 调用f(int), 而不是f(void*)
f(NULL); //可能会编译错误,但一般调用f(0),不可能调用f(void*)

而如果调用f(NULL),则其含义是不清晰的,如果NULL被定义为0L,因为long类型可转化为intboolvoid*都是可以的,这样模棱两可的问题直到C++11定义了nullptr才被解决,有着更清晰的语义,同样也不会有这样的困扰,因为nullptr不是一个整形,但是准确的说,它也不是一个确定的指针类型,可以把它理解为任意类型的指针,它的准确类型是std::nullptr_t,一个可以隐式转换为任意指针类型的类型。用nullptr代替NULL0,可以使得重载函数的调用明确。

最后需要明确的是,一个int类型可以转化为NULL,但是nullptr不能由int类型转化而来,必须是一个指针类型。

template<typename FuncType,
         typename MuxType,
         typename PtrType>
         //decltype(auto)是C++14的用法
decltype(auto) lockAndCall(FuncType func, 
MuxType& mutex,
PtrType ptr)
{
MuxGuard g(mutex);
return func(ptr);
}

这样的一个模板函数,可以看到第一个参数是一个函数类型,第二个应该传入指针类型、

//声明这么一个函数
void f(void*);

lockAndCall(f,0);//编译失败,0不能转化为void*
lockAndCall(f,NULL);//同上
lockAndCall(f,nullptr);//成功
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值