指针字面量(nullptr)

关键词 nullptr 代表指针字面量。它是 std::nullptr_t 类型的纯右值。存在从 nullptr 到任何指针类型及任何成员指针类型的隐式转换。同样的转换对于任何空指针常量也存在,空指针常量包括 std::nullptr_t 的值,以及宏 NULL。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <cstddef>
#include <iostream>

template<class T>
constexpr T clone(const T& t)
{
return t;
}

void g(int*)
{
std::cout << "函数 g 已调用\n";
}

int main()
{
g(nullptr); // 良好
g(NULL); // 良好
g(0); // 良好

g(clone(nullptr)); // 良好
// g(clone(NULL)); // 错误:非字面量的零不能为空指针常量
// g(clone(0)); // 错误:非字面量的零不能为空指针常量
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*

NULL 是一个宏定义

#undef NULL
#if defined(__cpluscplus)
#defined NULL 0
#else
#define NULL ((void *)0)
#endif

*/

void func(char* p)
{
std::cout << "invoke func(char*)" << std::endl;
}

void func(int)
{
std::cout << "invoke func(int)" << std::endl;
}

int main()
{
func(nullptr); // call func(char*)
func(0); // call func(int)
func((char*)0); // call func(char*)
func(NULL); // call func(int)

return 0;
}