nullptr/nullptr_t
生活随笔
收集整理的這篇文章主要介紹了
nullptr/nullptr_t
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
解釋
關鍵詞 nullptr 代表指針字面量。它是 std::nullptr_t 類型的純右值。存在從 nullptr 到任何指針類型及任何成員指針類型的隱式轉換。同樣的轉換對于任何空指針常量也存在,空指針常量包括 std::nullptr_t 的值,以及宏 NULL。
引入原因
為什么引入nullptr呢, 不是有NULL這個關鍵字么?
的確,但是我想問你NULL是什么類型的?
C++98中NULL是個宏定義,明確規定NULL是個整型0值:
/* Define NULL pointer value */#ifndef NULL #ifdef __cplusplus #define NULL 0 #else /* __cplusplus */ #define NULL ((void *)0) #endif /* __cplusplus */#endif /* NULL */C中NULL規定為void*指針:
#define NULL ((void*)0)可以看出,C和C++中NULL的規定是不同的,原因在于C++的重載機制。
void foo(int) {}void foo(int*) {} foo(0); // 調用foo(int)而不是foo(int*)foo(NULL); // 如果NULL是0,則調用foo(int); 如果NULL是0L,則編譯錯誤C++98規定NULL是一個整型0值,根據不同的編譯器實現,可能是0或0L。更尷尬的是,可以拿NULL當合法的整型(int或者long)來使用,所以C++11引入了nullptr表示指針的0值,雖然它不是指針類型,但是它能夠轉換成任何指針,而且它不能轉換成int或者其他類型:
void foo(char *);void foo(int);#include <iostream>#include <typeinfo>int main(){ std::cout << "" << typeid(NULL).name() << std::endl;}foo(0); // 調用 foo(int)// foo(NULL); // 該行不能通過編譯foo(nullptr);?//?調用?foo(char*)std::nullptr_t
nullptr也有其自身的類型,它的類型為std::nullptr_t。std::nullptr_t本身不是指針類型,但是它可以轉換為任何指針類型,這也就是nullptr可以看做任何指針類型的原因。它的定義如下:
typedef decltype(nullptr) nullptr_t;上面是一個很有趣的類型定義。通常情況是先有類型,然后才有該類型的變量。而上面的定義則是,先有一個某類型的字面值,再由這個字面值定義它的類型。妙哉!
總結
以上是生活随笔為你收集整理的nullptr/nullptr_t的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: decltype 和 auto
- 下一篇: 变量之--列表初始化和结构化绑定