设为首页 加入收藏

TOP

Item8 Prefer nullptr to 0 and NULL
2016-10-09 14:31:33 】 浏览:359
Tags:Item8 Prefer nullptr and NULL

0是 int类型,并不是指针类型,但是当 0赋值给一个指针类型的时候, 0将会被解释成空指针,在C++98中关键字 NULL其本质就是一个 long int类型的数值 0,在实际使用过程中这带来了很多模棱两可的问题。

   void f(int);
void f(bool);
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类型都可以转换为指针类型呢

         void test(void*);
test(0);
int data = 0;
test(data);         

很遗憾 test(data)无法编译通过,因为无法从 int类型转换为 void*类型,了解了上面这个事实,那么下面这个例子你应该很容易就理解了。

            template
  
   
decltype(auto) Call(FuncType func,PtrType ptr) {
    return func(ptr);
}

Call(test,0);
              

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

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Item9 Prefer alias declarations.. 下一篇23. 面向对象设计模式

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目