我是靠谱客的博主 开朗指甲油,最近开发中收集的这篇文章主要介绍C++中nullptr和NULL,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

C++中nullptr和NULL:

在C99里面,NULL可以被定义为0或者0L(32位和64位的区别),或者直接就是由0或者0L转成的void*。

问题:
  1. 函数重载的问题:

void func(int a);
void func(void *a);
对于上面两个重载的函数,func(NULL)会使用上面那个版本,但是> func(nullptr)会使用下面这个版本。

  1. 模板匹配问题:

struct Data{
Data(char *a){}
};
对于上面这个结构体,std::make_shared(NULL);会报错,此时必须使用nullptr。

make_shared的操作是先给_Ref_count_obj<_Ty>类型分配一块内存,然后再placement new,回想一下我们平常使用shared_ptr的时候,都是shared_ptr foo(new T(arg…))这样用的,但是其实用make_shared创建shared_ptr的方法更为高效,因为我们从模板中可以看到shared_ptr的占用空间其实是要比T要大的(为了保存引用计数的东西)。如果我们使用shared_ptr foo(new T(arg…))来构造shared_ptr,那么要先给T分配内存并构造T,然后在分配ref_count的内存,但是如果使用make_shared,那么就会直接给T和ref_count一起分配内存,然后再通过C++11的完美转发把T的构造函数传给make_shared。

好现在回到我们这篇博客的主题,为什么传一个NULL会报错呢?这是因为由于C++的NULL就是一个字面值常量0,所以传进去时,会被forward推断成int &&,int &&与char *当然不是一个东西,就会报错。

最后

以上就是开朗指甲油为你收集整理的C++中nullptr和NULL的全部内容,希望文章能够帮你解决C++中nullptr和NULL所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部