NULL与nullptr二义性问题

在编程逻辑世界,有因必有果,如果一个结果含糊不定(二义性),显然是我们不想要的。C++11中引入nullptr是为了解决NULL的二义性问题。

NULL二义性的体现

1
2
void func(int) {}
void func(int *) {}
当函数调用func(NULL)时会是怎样执行?

先看C++对NULL的定义:

1
2
3
4
5
#if defined(__cplusplus) 
# define NULL 0 /* C++中使用0作为NULL的值 */
#else
# define NULL ((void *)0) /* C中使用((void *)0)作为NULL的值 */
#endif

我们可以看到C++的NULL宏定义为0,所以函数func(NULL)会因为NULL为0而导致调用func(int)函数,这是我们不想要的结果。

那怎么解决问题呢?

使用nullptr(空指针常量),当函数调用func(nullptr)时则会调用func(int *)函数。