NULL與nullptr的二義性問題

  • 2019 年 10 月 4 日
  • 筆記

在編程邏輯世界,有因必有果,如果一個結果含糊不定(二義性),顯然是我們不想要的。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 *)函數。