解释
关键词 nullptr 代表指针字面量。它是 std::nullptr_t 类型的纯右值。存在从 nullptr 到任何指针类型及任何成员指针类型的隐式转换。同样的转换对于任何空指针常量也存在,空指针常量包括 std::nullptr_t 的值,以及宏 NULL。
引入原因
为什么引入nullptr呢, 不是有NULL这个关键字么?
的确,但是我想问你NULL是什么类型的?
C++98中NULL是个宏定义,明确规定NULL是个整型0值:
1 /* Define NULL pointer value */
2 #ifndef NULL
3 #ifdef __cplusplus
4 #define NULL 0
5 #else /* __cplusplus */
6 #define NULL ((void *)0)
7 #endif /* __cplusplus */
8 #endif /* NULL */
C中NULL规定为void*指针:
#define NULL ((void*)0)
可以看出,C和C++中NULL的规定是不同的,原因在于C++的重载机制。
1 void foo(int) {}
2 void foo(int*) {}
3
4 foo(0); // 调用foo(int)而不是foo(int*)
5 foo(NULL); // 如果NULL是0,则调用foo(int); 如果NULL是0L,则编译错误
C++98规定NULL是一个整型0值,根据不同的编译器实现,可能是0或0L。更尴尬的是,可以拿NULL当合法的整型(int或者long)来使用,所以C++11引入了nullptr表示指针的0值,虽然它不是指针类型,但是它能够转换成任何指针,而且它不能转换成int或者其他类型:
1 oid foo(char *);
2 void foo(int);
3 #include <iostream>
4 #include <typeinfo>
5 int main()
6 {
7 std::cout << "" << typeid(NULL).name() << std::endl;
8 }
9 foo(0); // 调用 foo(int)
10 // foo(NULL); // 该行不能通过编译
11 foo(nullptr); // 调用 foo(char*)
std::nullptr_t
nullptr也有其自身的类型,它的类型为std::nullptr_t。std::nullptr_t本身不是指针类型,但是它可以转换为任何指针类型,这也就是nullptr可以看做任何指针类型的原因。它的定义如下:
typedef decltype(nullptr) nullptr_t;
上面是一个很有趣的类型定义。通常情况是先有类型,然后才有该类型的变量。而上面的定义则是,先有一个某类型的字面值,再由这个字面值定义它的类型。妙哉!
原文地址:http://www.cnblogs.com/ybqjymy/p/16852033.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性