3 回答

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
在該代碼中,似乎沒有優(yōu)勢(shì)。但是請(qǐng)考慮以下重載函數(shù):
void f(char const *ptr);
void f(int v);
f(NULL); //which function will be called?
將調(diào)用哪個(gè)函數(shù)?當(dāng)然,這里的意圖是打電話f(char const *),但實(shí)際上f(int)會(huì)打電話!那是個(gè)大問題1,不是嗎?
因此,解決此類問題的方法是使用nullptr:
f(nullptr); //first function is called
當(dāng)然,這并不是的唯一優(yōu)勢(shì)nullptr。這是另一個(gè):
template<typename T, T *ptr>
struct something{}; //primary template
template<>
struct something<nullptr_t, nullptr>{}; //partial specialization for nullptr
由于在模板中,的類型nullptr推導(dǎo)為nullptr_t,因此您可以這樣編寫:
template<typename T>
void f(T *ptr); //function to handle non-nullptr argument
void f(nullptr_t); //an overload to handle nullptr argument!!!
1.在C ++中,NULL定義為#define NULL 0,所以基本上是int,這就是為什么f(int)要調(diào)用它。

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊
這里的真正動(dòng)機(jī)是完美的轉(zhuǎn)發(fā)。
考慮:
void f(int* p);
template<typename T> void forward(T&& t) {
f(std::forward<T>(t));
}
int main() {
forward(0); // FAIL
}
簡(jiǎn)而言之,0是一個(gè)特殊值,但是值不能通過僅系統(tǒng)類型傳播。轉(zhuǎn)發(fā)功能是必不可少的,0不能處理它們。因此,絕對(duì)有必要引入nullptr,其中類型是特殊的,并且類型確實(shí)可以傳播。實(shí)際上,MSVC團(tuán)隊(duì)nullptr在實(shí)施右值引用之后必須提前引入,然后自己發(fā)現(xiàn)此陷阱。
還有一些其他情況nullptr可以使生活更輕松-但這不是核心問題,因?yàn)檠輪T可以解決這些問題??紤]
void f(int);
void f(int*);
int main() { f(0); f(nullptr); }
調(diào)用兩個(gè)單獨(dú)的重載。另外,考慮
void f(int*);
void f(long*);
int main() { f(0); }
這是模棱兩可的。但是,使用nullptr,您可以提供
void f(std::nullptr_t)
int main() { f(nullptr); }
- 3 回答
- 0 關(guān)注
- 498 瀏覽
添加回答
舉報(bào)