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.cppnull.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。
請看下面的代碼:
//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.cppmain.cpp:?In?function?‘int?main()’:
main.cpp:16:14:?error:?call?of?overloaded?‘test(NULL)’?is?ambiguous
?????test(NULL);
很不幸,編譯報錯了,提示我們有二義性,按照《重載函數匹配規則》,兩個都可以匹配,因此最終報錯。
但是如果我們使用nullptr卻不會:
test(nullptr);除了這點之外,在C++模板中它還有更好的表現。
看下面的代碼:
#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?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吴恩达 coursera ML 第十六课
- 下一篇: 吴恩达 coursera ML 第十七课