我正在閱讀S.Meyers的Effective Modern C++,我發現了一些我無法完全理解的東西。爲什麼模板內部的類型檢查更嚴格?
第8項解釋了爲什麼nullptr
應該優於0
或NULL
。贊成nullptr
的主要觀點是在超載分辨率下更安全的行爲。在實踐中,你可以避免指針和整數類型之間的無意混淆,但這不是我的問題的關鍵。
要到我的實際問題時,請考慮下面的代碼,這是基於在本書中使用的例子:
#include <memory>
class MyClass {
int a;
};
// dummy functions that take pointer types
int f1(std::shared_ptr<MyClass> spw){return 1;};
double f2(std::unique_ptr<MyClass> upw){return 1.0;};
bool f3(MyClass* pw){return true;};
// template that calls a function with a pointer argument
template<typename FuncType,
typename PtrType>
auto CallFun(FuncType func, PtrType ptr) -> decltype(func(ptr))
{
return func(ptr);
}
int main()
{
// passing null ptr in three different ways
// they all work fine int this case
auto result1 = f1(0); // pass 0 as null ptr to f1
auto result2 = f2(NULL); // pass NULL as null ptr to f2
auto result3 = f3(nullptr); // pass nullptr as null ptr to f3 }
// passing null ptr in three different ways through the template
// only nullptr works in this case
auto result4 = CallFun(f1, 0); // compile error!
auto result5 = CallFun(f2, NULL); // compile error!
auto result6 = CallFun(f3, nullptr); // OK
return 0;
}
前三直接調用f1
,f2
和f3
編譯罰款或者0
,NULL
或nullptr
作爲空指針。隨後的3個調用通過模板函數CallFun
執行更加挑剔:您必須使用nullptr
,否則將不接受整數類型(0
和NULL
)之間的轉換。換句話說,類型檢查在模板內部發生時似乎更爲嚴格。有人可以澄清發生了什麼嗎?
我問完全相同的問題:)請參閱我放的dupe鏈接,並參見標準報價。 – vsoftco