Skip to content

Commit 58101ca

Browse files
authored
fix: 修正 nullptr 的错误描述 (#50)
1 parent 89bea6e commit 58101ca

1 file changed

Lines changed: 23 additions & 8 deletions

File tree

book/src/cpp11/12-nullptr.md

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,37 @@
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
5265
void func(int* ptr) {
@@ -61,17 +74,19 @@ void func(int value) {
6174

6275
int 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
7287
main.cpp: In function 'int main()':
7388
main.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

Comments
 (0)