日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nullptr/nullptr_t

發布時間:2024/4/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。