Item8 Prefer nullptr to 0 and NULL

[复制链接]

该用户从未签到

759

主题

763

帖子

4660

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4660
跳转到指定楼层
楼主
发表于 2018-6-4 16:06:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

想要查看内容赶紧注册登陆吧!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
0是int类型,并不是指针类型,但是当0赋值给一个指针类型的时候,0将会被解释成空指针,在C++98中关键字NULL其本质就是一个long int类型的数值0,在实际使用过程中这带来了很多模棱两可的问题。
  1. void f(int);
  2. void f(bool);
  3. void f(void*);
复制代码
对于上面三个重载来说,如果调用f(0),那么会匹配第一个,如果调用f(NULL),这会导致重载决策失败,因为long int可以隐式转换为int,bool和void*,所以在函数重载决议的时候会模棱两可。如果有void f(long int)这样的重载的话那么f(NULL)是可以匹配的,在C++11中这一问题得到了解决,但是为了兼容之前的代码,NULL关键字还是保留原来的含义,引入了nullptr不再是整型了,但老实说它也不是空指针类型,而是std::nullptr_t类型,更奇怪的是std::nullptr_t的类型又是nullptr类型,这是一个循环类型定义,而std::nullptr_t类型可以隐式转换为任意类型的指针。   在上面我提到了0可以隐式转换为指针类型,0本身是int类型,那么是不是int类型都可以转换为指针类型呢?
  1. void test(void*);
  2. test(0);
  3. int data = 0;
  4. test(data);
复制代码
很遗憾test(data)无法编译通过,因为无法从int类型转换为void*类型,了解了上面这个事实,那么下面这个例子你应该很容易就理解了。
  1. template<typename FuncType,
  2.          typename PtrType>
  3. decltype(auto) Call(FuncType func,PtrType ptr) {
  4.     return func(ptr);
  5. }

  6. Call(test,0);
复制代码
上面的调用会失败,因为0经过模板类型推导后变成了int类型的ptr,而int类型是无法转换为指针类型的。如果在这里把0换成nullptr就可以调用成功了。

分享到:  QQ好友和群QQ好友和群
收藏收藏
回复

使用道具 举报

快速回复高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表