th:text为null报错_为什么建议你用nullptr而不是NULL?
來(lái)源:公眾號(hào)【編程珠璣】
作者:守望先生
網(wǎng)站:https://www.yanbinghu.com
前言
在C語(yǔ)言中,我們常常用NULL作為指針變量的初始值,而在C++中,卻不建議你這么做。
NULL是什么
在《NULL,0,'\0',"0","\0"的區(qū)別》一文中,我們已經(jīng)知道了在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
也就是說(shuō),在C++中,NULL不過(guò)也是0罷了,把它當(dāng)成空指針只是一個(gè)無(wú)可奈何的選擇罷了。
那么為什么在C++和C中不一樣呢?因?yàn)镃++中不能將void *類(lèi)型的指針隱式轉(zhuǎn)換成其他指針類(lèi)型,從下面的例子可以看出來(lái):
//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并非整型類(lèi)別,甚至也不是指針類(lèi)型,但是能轉(zhuǎn)換成任意指針類(lèi)型。nullptr的實(shí)際類(lèi)型是std:nullptr_t。
來(lái)源:公眾號(hào)【編程珠璣】,專(zhuān)注但不限于分享計(jì)算機(jī)編程基礎(chǔ),Linux,C語(yǔ)言,C++,數(shù)據(jù)結(jié)構(gòu)與算法,工具,資源等編程相關(guān)[原創(chuàng)]技術(shù)文章。博客:https://www.yanbinghu.com/2019/08/25/36794.html
為什么該使用nullptr
回到最開(kāi)始的問(wèn)題,為什么作為指針的語(yǔ)義,我們應(yīng)該使用nullptr,而不是NULL。
請(qǐng)看下面的代碼:
//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);
很不幸,編譯報(bào)錯(cuò)了,提示我們有二義性,按照《重載函數(shù)匹配規(guī)則》,兩個(gè)都可以匹配,因此最終報(bào)錯(cuò)。
但是如果我們使用nullptr卻不會(huì):
test(nullptr);除了這點(diǎn)之外,在C++模板中它還有更好的表現(xiàn)。
看下面的代碼:
#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;
}
編譯報(bào)錯(cuò)了:
main.cpp:8:8:?error:?invalid?conversion?from?‘long?int’?to?‘int*’?[-fpermissive]?????fun(ptr);
很顯然NULL被推導(dǎo)為long int,而不是空指針,因而導(dǎo)致函數(shù)類(lèi)型不匹配而報(bào)錯(cuò)。
但是如果我們用nullptr就不會(huì)有上面的問(wèn)題。
總結(jié)
如果你想表示空指針,那么使用nullptr,而不是NULL。
注:nullptr在C++ 11中才出現(xiàn)。
推薦閱讀:
如何優(yōu)雅地處理命令行參數(shù)?
給程序員的幾點(diǎn)小建議
認(rèn)真理一理C++的構(gòu)造函數(shù)
關(guān)注公眾號(hào)【編程珠璣】,獲取更多Linux/C/C++/Python/Go/算法/工具等原創(chuàng)技術(shù)文章。后臺(tái)免費(fèi)獲取經(jīng)典電子書(shū)和視頻資源
總結(jié)
以上是生活随笔為你收集整理的th:text为null报错_为什么建议你用nullptr而不是NULL?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 吴恩达 coursera ML 第十六课
- 下一篇: 吴恩达 coursera ML 第十七课