博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【漫游C++11】nullptr与std::nullptr_t
阅读量:7013 次
发布时间:2019-06-28

本文共 1320 字,大约阅读时间需要 4 分钟。

hot3.png

在C/C++中,有一个常用的宏:NULL。在C语言中,一般定义为((void*)0),也允许定义成0,在C++中,NULL必须是0。

即:

#ifndef NULL    #ifdef __cplusplus        #define NULL 0             // C++    #else        #define NULL ((void *)0)   // C语言的通常定义      现在的C语言(C99)现在已经支持用“//”注释    #endif#endif

这样的定义,一不留神就会引起误解:

void Func(char*){    std::cout << "Func(char*)" << std::endl;}void Func(int){    std::cout << "Func(int)" << std::endl;}int main(){    Func(NULL); // Func(int)    return 0;}

由于我们经常用NULL表示空指针,所以上面的代码容易被误认为是调用第一个Func,但实际上,由于NULL在C++中是0,所以调用了第二个。

在头脑清醒的时候,这不是什么问题,但随着代码量的增加,我们很难把注意力集中到这个细节上,就算注意到了这个问题,它也会成为不必要的心智负担。

nullptr应运而生。

nullptr是std::nullptr_t类型的(constexpr)变量。std::nullptr_t可以显式或隐式地转换为任何指针(包括类的成员函数指针),但不能显式或隐式地转换为任何其他类型。

使用nullptr可以消除这个误会,例如,上面的代码,调用Func(nullptr)一定输出Func(char*)。

其实,C++11将NULL重新定义效果会更好一些,但可能是考虑到已经有太多的代码用了NULL,为了使得以前的代码仍任可用,所以才新增的nullptr吧。

最后,补充一些细节:

1)std::nullptr_t不能用于算术表达式,即,不能+、-、*等;

2)std::nullptr_t可以用于关系表达式,两个std::nullptr_t类型的变量,进行==、<=、>=运算都会返回true,其他的关系运算返回false;

3)nullptr不能进行&(取地址)运算。

如果你的编译器不支持C++11,可以用C++98/C++03模拟一个nullptr:

// 不支持C++11的编译器class nullptr_tt{public:    template
 operator _Tx*() const { return 0; }    template
 operator _Ty _Tx::*() const{ return 0; }private:    void operator& () const; // 不允许取地址};const nullptr_tt nullptr;

转载于:https://my.oschina.net/jthmath/blog/539845

你可能感兴趣的文章
品钛在美国上市 魏伟:上市不是锣鼓欢庆 而是起跑发令枪
查看>>
学习Python爬虫真的不难,只需要明白这四个点!
查看>>
新疆国省干线总里程突破2.9万公里
查看>>
国产智轨电车开进“冰城”接受严寒测试 表现良好
查看>>
缓解“钱紧” 央行本周公开市场净投放创两年新高
查看>>
21岁大专学历,刚培训完前端,不造假简历,能找到工作吗?
查看>>
国内首部区块链行业纪录片开播
查看>>
List集合就这么简单【源码剖析】
查看>>
Spring Cloud (十四):Spring Cloud 开源软件都有哪些?
查看>>
前端状态管理与有限状态机
查看>>
读Zepto源码之Data模块
查看>>
Redux助力美团点评前端进阶之路
查看>>
【闭包概念】关于闭包概念不同解读——你可以自己理解。
查看>>
More-iOS国际化一站式解决方案
查看>>
BCH一周年:从硬分叉到顺风顺水
查看>>
数据结构和算法面试题系列—排序算法之快速排序
查看>>
打破行业壁垒!阿里云OpenSearch开启个性化搜索里程碑
查看>>
Struts2第十二篇【模型驱动】
查看>>
Java多线程之并发安全经典案例-卖票
查看>>
从程序员的角度设计一个Java的神经网络
查看>>