在編程邏輯世界,有因必有果,如果一個結果含糊不定(二義性),顯然是我們不想要的。C++11中引入nullptr是爲了解決NULL的二義性問題。
NULL二義性的體現
void func(int) {}
void func(int *) {}
當函數調用func(NULL)時會是怎樣執行?
先看C++對NULL的定義:
#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 *)
函數。