条款八 倾向使用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相关推荐

  1. 《Effective Morden C++》Item 8: Prefer nullptr to 0 and NULL.

    引子 这一条目就比较简单了,就是宣传用nullptr来指代空指针,而不是之前的0或者NULL. 正文 在老式C++中,显然0是int类型,而NULL也是一个整数类型(int或者long).总的来说,这 ...

  2. Effective C#: Item 3: Prefer the is or as Operators to Casts

    Item 3: Prefer the is or as Operators to Casts C#是强类型语言.我们要尽量避免类型转换. 有时我们必须要在runtime检查一个变量的类型.比如有时你要 ...

  3. Item 02: Prefer consts, enums, and inlines to #defines

    Item 02: Prefer consts, enums, and inlines to #defines 尽量以 const,enum,inline 替换 #define 假如有这样的语句: #d ...

  4. C++ NULL nullptr和0的区别

    C中的NULL 在C语言中我们将NULL用作空指针之用,NULL在C语言中的定义如下: #define NULL ((void *)0) 可以看到,C语言中NULL是一个void*指针,我们常用其来对 ...

  5. 空指针:从 0 到 NULL,再到 nullptr

    nullptr 空指针:从 0 到 NULL,再到 nullptr NULL 是一个宏定义: #undef NULL #if defined(__cplusplus) #define NULL 0 # ...

  6. C++11中0与 NULL与nullptr之间的关系

    1.从本质上1) 0是int型的字面值常量2) NULL 是预处理变量,定义在 cstdlib 中,其值是03) nullptr 是 nullptr_t 类型的字面值. 2.cstdlib 中 NUL ...

  7. Effective Modern C++[实践]->优先使用nullptr,而非0或NULL

    优先使用nullptr 回看旧识 空指针 `void*` 在`c++`中必须显式地将`malloc`的返回值类型转换为`(int *)`. 不知`void *`所指,如何强转 `void*` 不能直接 ...

  8. Item 13: Prefer const_iterators to iterators.

    Item 13: Prefer const_iterators to iterators. Effective Modern C++ Item 13 的学习和解读. STL 中 const_itera ...

  9. C语言nullptr错误,c/c++中的NULL,nullptr,0

    NULL,nullptr与0 0 NULL C语言中 C++中 隐式类型转换 nullptr 预处理中的条件编译语句 0 在我们的程序中,单纯一个0,在不同的类型中有着不同的意思 0,是一个空字符常量 ...

最新文章

  1. 无埋点数据收集和adb monkey测试屏蔽通知栏
  2. 爬取许嵩新歌《雨幕》弹幕,告诉你什么才是真正的创作!
  3. PPC系统常见启动项(StartUp)解说
  4. 李国庆离开当当,广东消委会告长隆,智能校服提供定位功能,全球首个5G火车站来了,这就是今天的大新闻...
  5. SQLServer之创建非聚集索引 1
  6. 三星S10背板设计已确定:画面甚是感人
  7. 在div中使用css让文字底部对齐的方法
  8. 众说纷纭的ul、ol、li
  9. 23.docker export
  10. 【J2EE】【1.HelloWorld】J2EE基础(jsp,servlet,tomcat,eclipse)
  11. VMware密匙安装教程
  12. flash读取程序 msp430_MSP430内部FLASH详细操作
  13. 【存储】超融合(HCI)和云是什么以及区别|超融合和虚拟化的区别
  14. 一个基于WinHttp的轻量级的分片下载库介绍
  15. pythonIED -pycharm基础知识
  16. 老徐FrankXuLei 受邀为中国东方航空上海研发中心讲授微软.NET企业开发课程
  17. 为什么会“道可道非常道,名可名非常名”?
  18. java实现 zip rar 7z 压缩包解压
  19. Scrum立会报告+燃尽图(Final阶段第七次)
  20. python图像处理-形状提取和识别1(基于Hough的形状提取)

热门文章

  1. Kotlin 性能优化利器 —— Sqeuence 原理浅析
  2. IAR实际使用过程中遇到的问题
  3. C#获取枚举描述代码
  4. 新CCIE笔记之'口口相传'路由协议
  5. 高通Vuforia优化目标检测与跟踪稳定性
  6. 使用go脚本向MySQL表中写入数据
  7. hicharts Linux服务器导出,中文字体问题
  8. Android5.1.1 - zygote中获取系统服务时抛出异常
  9. (转)目前比较全的CSS重设(reset)方法总结
  10. Linux ext3grep 恢复数据