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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

[EMC++] Item 8. Prefer nullptr to 0 and NULL

發(fā)布時間:2025/5/22 c/c++ 134 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [EMC++] Item 8. Prefer nullptr to 0 and NULL 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

條款八 傾向使用nullptr而非0和NULL

簡介

在C++中的字面量0是一個int,當(dāng)C++在一個只可以使用指針的情景中找到0,它勉強地把其解釋為null指針。

對于NULL也有類似的問題,具體實現(xiàn)允許給NULL一個整型(不一定是int,也可以是long等)。

但是最大的問題是0與NULL都不是指針類型

在C++98中,主要的問題是在指針和整形的重載中會導(dǎo)致困惑

// 傳遞0或者NULL永遠(yuǎn)不會調(diào)用指針的重載函數(shù) void f(int); void f(bool); void f(void*);f(0); // call f(int) f(NULL); // may not compile, typically calls f(int)

調(diào)用的主要問題在于,代碼的表面意思(函數(shù))與實際意思(整形)相互矛盾。

nullptr既不是一個整型,也不是一個指針類型,你可以把它看做一個指向所有類型的指針,其真正的類型是std::nullptr_t,它能隱性轉(zhuǎn)換為所有的指針類型。

案例

以下是調(diào)用鎖的一段程序,且能正確運行,但是有些瑕疵:

int f1(std::shared_ptr<Widget> spw); double f2(std::unique_ptr<Widget> upw); bool f3(Widget* pw);std::mutex f1m, f2m, f3m; using MuxGuard = std::lock_guard<std::mutex>; {MuxGuard g(f1m);auto result = f1(0); } {MuxGuard g(f2m);auto result = f2(NULL); } {MuxGuard g(f3m);auto result = f3(nullptr); }

可以改寫為模板調(diào)用方式:

template<typename FuncType, typename MuxType, typename PtrType> decltype(auto) lockAndCall(FuncType func, MuxType& mutex, PtrType ptr) {MuxGuard g(mutex);return func(ptr); } auto result1 = lockAndCall(f1, f1m, 0); // error! auto result2 = lockAndCall(f2, f2m, NULL); // error! auto result3 = lockAndCall(f3, f3m, nullptr); // fine

在第一個調(diào)用中,由于0被推斷為int類型,而把int當(dāng)作std::unique_ptr<Widget>類型傳遞時發(fā)生錯誤。第二個調(diào)用類似。

總結(jié)

  • 傾向使用nullptr而非0和NULL

  • 避免整形與指針

總結(jié)

以上是生活随笔為你收集整理的[EMC++] Item 8. Prefer nullptr to 0 and NULL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。