[EMC++] Item 8. Prefer nullptr to 0 and NULL
条款八 倾向使用nullptr而非0和NULL
简介
在C++中的字面量0
是一个int
,当C++在一个只可以使用指针的情景中找到0,它勉强地把其解释为null
指针。
对于NULL
也有类似的问题,具体实现允许给NULL一个整型(不一定是int,也可以是long等)。
但是最大的问题是0与NULL都不是指针类型
在C++98
中,主要的问题是在指针和整形的重载中会导致困惑
// 传递0或者NULL永远不会调用指针的重载函数
void f(int);
void f(bool);
void f(void*);f(0); // call f(int)
f(NULL); // may not compile, typically calls f(int)
调用的主要问题在于,代码的表面意思(函数)与实际意思(整形)相互矛盾。
nullptr既不是一个整型,也不是一个指针类型,你可以把它看做一个指向
所有类型
的指针,其真正的类型是std::nullptr_t
,它能隐性转换为所有的指针类型。
案例
以下是调用锁的一段程序,且能正确运行,但是有些瑕疵:
int f1(std::shared_ptr<Widget> spw);
double f2(std::unique_ptr<Widget> upw);
bool f3(Widget* pw);std::mutex f1m, f2m, f3m;
using MuxGuard = std::lock_guard<std::mutex>;
{MuxGuard g(f1m);auto result = f1(0);
}
{MuxGuard g(f2m);auto result = f2(NULL);
}
{MuxGuard g(f3m);auto result = f3(nullptr);
}
可以改写为模板调用方式:
template<typename FuncType, typename MuxType, typename PtrType>
decltype(auto) lockAndCall(FuncType func, MuxType& mutex, PtrType ptr) {MuxGuard g(mutex);return func(ptr);
}
auto result1 = lockAndCall(f1, f1m, 0); // error!
auto result2 = lockAndCall(f2, f2m, NULL); // error!
auto result3 = lockAndCall(f3, f3m, nullptr); // fine
在第一个调用中,由于0
被推断为int
类型,而把int
当作std::unique_ptr<Widget>
类型传递时发生错误。第二个调用类似。
总结
倾向使用nullptr而非0和NULL
避免整形与指针
[EMC++] Item 8. Prefer nullptr to 0 and NULL相关推荐
- 《Effective Morden C++》Item 8: Prefer nullptr to 0 and NULL.
引子 这一条目就比较简单了,就是宣传用nullptr来指代空指针,而不是之前的0或者NULL. 正文 在老式C++中,显然0是int类型,而NULL也是一个整数类型(int或者long).总的来说,这 ...
- Effective C#: Item 3: Prefer the is or as Operators to Casts
Item 3: Prefer the is or as Operators to Casts C#是强类型语言.我们要尽量避免类型转换. 有时我们必须要在runtime检查一个变量的类型.比如有时你要 ...
- Item 02: Prefer consts, enums, and inlines to #defines
Item 02: Prefer consts, enums, and inlines to #defines 尽量以 const,enum,inline 替换 #define 假如有这样的语句: #d ...
- C++ NULL nullptr和0的区别
C中的NULL 在C语言中我们将NULL用作空指针之用,NULL在C语言中的定义如下: #define NULL ((void *)0) 可以看到,C语言中NULL是一个void*指针,我们常用其来对 ...
- 空指针:从 0 到 NULL,再到 nullptr
nullptr 空指针:从 0 到 NULL,再到 nullptr NULL 是一个宏定义: #undef NULL #if defined(__cplusplus) #define NULL 0 # ...
- C++11中0与 NULL与nullptr之间的关系
1.从本质上1) 0是int型的字面值常量2) NULL 是预处理变量,定义在 cstdlib 中,其值是03) nullptr 是 nullptr_t 类型的字面值. 2.cstdlib 中 NUL ...
- Effective Modern C++[实践]->优先使用nullptr,而非0或NULL
优先使用nullptr 回看旧识 空指针 `void*` 在`c++`中必须显式地将`malloc`的返回值类型转换为`(int *)`. 不知`void *`所指,如何强转 `void*` 不能直接 ...
- Item 13: Prefer const_iterators to iterators.
Item 13: Prefer const_iterators to iterators. Effective Modern C++ Item 13 的学习和解读. STL 中 const_itera ...
- C语言nullptr错误,c/c++中的NULL,nullptr,0
NULL,nullptr与0 0 NULL C语言中 C++中 隐式类型转换 nullptr 预处理中的条件编译语句 0 在我们的程序中,单纯一个0,在不同的类型中有着不同的意思 0,是一个空字符常量 ...
最新文章
- 无埋点数据收集和adb monkey测试屏蔽通知栏
- 爬取许嵩新歌《雨幕》弹幕,告诉你什么才是真正的创作!
- PPC系统常见启动项(StartUp)解说
- 李国庆离开当当,广东消委会告长隆,智能校服提供定位功能,全球首个5G火车站来了,这就是今天的大新闻...
- SQLServer之创建非聚集索引 1
- 三星S10背板设计已确定:画面甚是感人
- 在div中使用css让文字底部对齐的方法
- 众说纷纭的ul、ol、li
- 23.docker export
- 【J2EE】【1.HelloWorld】J2EE基础(jsp,servlet,tomcat,eclipse)
- VMware密匙安装教程
- flash读取程序 msp430_MSP430内部FLASH详细操作
- 【存储】超融合(HCI)和云是什么以及区别|超融合和虚拟化的区别
- 一个基于WinHttp的轻量级的分片下载库介绍
- pythonIED -pycharm基础知识
- 老徐FrankXuLei 受邀为中国东方航空上海研发中心讲授微软.NET企业开发课程
- 为什么会“道可道非常道,名可名非常名”?
- java实现 zip rar 7z 压缩包解压
- Scrum立会报告+燃尽图(Final阶段第七次)
- python图像处理-形状提取和识别1(基于Hough的形状提取)