88
99# nullptr - 指针字面量
1010
11- ` nullptr ` 是C++11引入的** 指针字面量** ,用于表示空指针。它解决了传统空指针表示方式(如` NULL ` 和` 0 ` )在类型安全性和重载解析方面的不足 。
11+ ` nullptr ` 是C++11引入的** 指针字面量** ,用于表示空指针。它解决了传统空指针表示方式(如` NULL ` 和` 0 ` )在类型安全性和重载决议方面的不足 。
1212
1313| Book | Video | Code | X |
1414| --- | --- | --- | --- |
1515| [ cppreference] ( https://en.cppreference.com/w/cpp/language/nullptr ) / [ markdown] ( https://github.com/mcpp-community/d2mcpp/blob/main/book/src/cpp11/12-nullptr.md ) | [ 视频解读] ( ) | [ 练习代码] ( https://github.com/mcpp-community/d2mcpp/blob/main/dslings/cpp11/12-nullptr-0.cpp ) | |
1616
1717** 为什么引入?**
1818
19- - 解决` NULL ` 宏和整数` 0 ` 在重载解析中的歧义问题
19+ - 解决` NULL ` 宏和整数` 0 ` 在 [ ** 重载决议 ** ] ( https://en.cppreference.com/cpp/language/overload_resolution ) 中的歧义问题
2020- 提供类型安全的空指针表示方式
2121- 明确区分指针和整数类型
2222- 支持模板编程中的类型推导
2323
2424** nullptr和NULL有什么区别?**
2525
2626- ` nullptr ` 是C++11引入的关键字,类型为` std::nullptr_t `
27- - ` NULL ` 是预处理宏,通常定义为整数` 0 ` 或` (void*)0 `
28- - ` nullptr ` 在重载解析中更精确,不会与整数类型混淆
27+ - ` NULL ` 宏是由实现定义的[ ** 空指针常量** ] ( https://en.cppreference.com/cpp/language/pointer#%E7%A9%BA%E6%8C%87%E9%92%88 ) 。
28+
29+ ** 可能的实现**
30+
31+ ``` cpp
32+ #define NULL 0
33+ // C++11 起
34+ #define NULL nullptr
35+ ```
36+
37+ > C 中,宏 `NULL ` 可以拥有类型 `void *`,但这在 C++ 中不允许,因为空指针常量不能具有该类型
38+
39+ - `nullptr `在重载决议中更精确,不会与空指针常量 `0 ` 混淆。
40+
41+ > `0 ` 的类型是`int `,C++禁止`int `到指针类型的转换,但 `0 ` 是一个例外,它属于空指针常量,可以隐式转换为任何指针类型,这就导致了重载决议中的歧义问题。C++11 引入了`nullptr ` 来解决这个问题。
2942
3043## 一、基础用法和场景
3144
@@ -46,7 +59,7 @@ if (ptr1 == nullptr) {
4659
4760### 解决重载歧义问题
4861
49- > 在函数调用中明确传递空指针,` nulltpr ` 能避免重载歧义问题, 并且避免与整数类型的混淆
62+ > 在函数调用中明确传递空指针,` nullptr ` 能避免重载歧义问题, 并且避免与整数类型的混淆
5063
5164``` cpp
5265void func (int* ptr) {
@@ -61,17 +74,19 @@ void func(int value) {
6174
6275int main() {
6376 func(nullptr); // 明确调用指针版本
64- func(0); // 可能调用整数版本,产生歧义
65- func(NULL); // 可能调用整数版本,产生歧义
77+ func(0); // 重载决议不明确,编译错误
78+ func(NULL); // 重载决议不明确,编译错误
6679}
6780```
6881
82+ > 此示例不同编译器存在差异,msvc 与 gcc/clang的行为不同, 但无论如何, `nullptr` 都能避免重载歧义问题。
83+
6984例如上面的代码中,调用`func(NULL)`就会报重载歧义错误
7085
7186```bash
7287main.cpp: In function 'int main()':
7388main.cpp:16:9: error: call of overloaded 'func(NULL)' is ambiguous
74- 16 | func(NULL); // 可能调用整数版本,产生歧义
89+ 16 | func(NULL); // 重载决议不明确,编译错误
7590 | ~~~~^~~~~~
7691```
7792
0 commit comments