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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

th:text为null报错_为什么建议你用nullptr而不是NULL?

發布時間:2025/3/15 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 th:text为null报错_为什么建议你用nullptr而不是NULL? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:公眾號【編程珠璣】

作者:守望先生

網站:https://www.yanbinghu.com

前言

在C語言中,我們常常用NULL作為指針變量的初始值,而在C++中,卻不建議你這么做。

NULL是什么

在《NULL,0,'\0',"0","\0"的區別》一文中,我們已經知道了在C中NULL是什么,在C的頭文件中,通常定義如下:

#define?NULL?((void*)0)

但是在C++中,它是這樣定義的:

#define?NULL?0

或者你可以在stddef.h看到完整的這段:

#undef?NULL
#if?defined(__cplusplus)
#define?NULL?0
#else
#define?NULL?((void?*)0)
#endif

也就是說,在C++中,NULL不過也是0罷了,把它當成空指針只是一個無可奈何的選擇罷了。

那么為什么在C++和C中不一樣呢?因為C++中不能將void *類型的指針隱式轉換成其他指針類型,從下面的例子可以看出來:

//null.cpp
#include
int?main(void){
????char?p[]?=?"12345";
????int?*a?= (void*)p;
????return?0;
}

編譯:

$?g+?-o?null?null.cpp
null.cpp:?In?function?'int?main()':
null.cpp:5:17:?error:?invalid?conversion?from?'void*'?to?'int*'?[-fpermissive]
??int?*a?=(void*)p;

所以不能將NULL定義為(void*)0。

nullptr

nullptr并非整型類別,甚至也不是指針類型,但是能轉換成任意指針類型。nullptr的實際類型是std:nullptr_t。

來源:公眾號【編程珠璣】,專注但不限于分享計算機編程基礎,Linux,C語言,C++,數據結構與算法,工具,資源等編程相關[原創]技術文章。博客:https://www.yanbinghu.com/2019/08/25/36794.html

為什么該使用nullptr

回到最開始的問題,為什么作為指針的語義,我們應該使用nullptr,而不是NULL。
請看下面的代碼:

//來源:公眾號【編程珠璣】,https://www.yanbinghu.com
//test.cpp
#include
using?namespace?std;
void?test(void?*p){
????cout<<"p?is?pointer?"<

endl;
}void?test(int?num){cout<<"num?is?int?"<endl;
}int?main(void){
????test(NULL);return?0;
}

編譯:

$?g++?-o?test?test.cpp
main.cpp:?In?function?‘int?main()’:
main.cpp:16:14:?error:?call?of?overloaded?‘test(NULL)’?is?ambiguous
?????test(NULL);

很不幸,編譯報錯了,提示我們有二義性,按照《重載函數匹配規則》,兩個都可以匹配,因此最終報錯。

但是如果我們使用nullptr卻不會:

test(nullptr);

除了這點之外,在C++模板中它還有更好的表現。
看下面的代碼:

//來源:公眾號【編程珠璣】,https://www.yanbinghu.com
#include
using?namespace?std;
template<typename?Type1,typename?ptrType>
void?test(Type1?fun,ptrType?ptr){
????/*do?something*/
????fun(ptr);
????return;
}
void?fun(int?*val){
????cout<<"fun"<<endl;
}
int?main(void){
????test(fun,NULL);
????return?0;
}

編譯報錯了:

main.cpp:8:8:?error:?invalid?conversion?from?‘long?int’?to?‘int*’?[-fpermissive]
?????fun(ptr);

很顯然NULL被推導為long int,而不是空指針,因而導致函數類型不匹配而報錯。

但是如果我們用nullptr就不會有上面的問題。

總結

如果你想表示空指針,那么使用nullptr,而不是NULL。

注:nullptr在C++ 11中才出現。

推薦閱讀:

如何優雅地處理命令行參數?

給程序員的幾點小建議

認真理一理C++的構造函數

關注公眾號【編程珠璣】,獲取更多Linux/C/C++/Python/Go/算法/工具等原創技術文章。后臺免費獲取經典電子書和視頻資源

總結

以上是生活随笔為你收集整理的th:text为null报错_为什么建议你用nullptr而不是NULL?的全部內容,希望文章能夠幫你解決所遇到的問題。

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