概述
C++中nullptr和NULL:
在C99里面,NULL可以被定义为0或者0L(32位和64位的区别),或者直接就是由0或者0L转成的void*。
问题:
- 函数重载的问题:
void func(int a);
void func(void *a);
对于上面两个重载的函数,func(NULL)会使用上面那个版本,但是> func(nullptr)会使用下面这个版本。
- 模板匹配问题:
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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复