2014-10-18 51 views
11

我注意到,很多提升和的libC++ /的libstdC++明確的SFINAE提供的默認值爲零的代碼一樣爲SFINAE測試人員提供默認值爲零的原因是什麼?

// libc++ http://llvm.org/svn/llvm-project/libcxx/trunk/include/memory 
namespace __has_pointer_type_imp 
{ 
    template <class _Up> static __two __test(...); 
    template <class _Up> static char __test(typename _Up::pointer* = 0); 
} 

template <class _Tp> 
struct __has_pointer_type 
    : public integral_constant<bool, sizeof(__has_pointer_type_imp::__test<_Tp>(0)) == 1> 
{ 
}; 

但是它混淆了我,爲什麼時,他們明確地撥打電話0這將預期。我記得在某處聽說它是一個優化(在實例化模板時加快編譯器的速度),但我不完全理解這將如何工作。我看了一下標準,它有一節簡要描述了與模板參數推導有關的默認參數會發生什麼。

14.8.2

在在模板參數推導過程的某些點,有必要採取函數類型,使得使用的模板參數和與對應的模板參數替換這些模板的參數。這是在模板參數推導的開始時完成的,當任何顯式指定的模板參數被替換爲函數類型時,並且在模板參數推導結束時,當從默認參數中推導或獲得的任何模板參數被替換時,也是如此。

最後一點有關於我的問題

在模板實參推演結束

,並再次當推導出或默認參數獲得任何模板參數取代聲音。

但是,如果它需要做更多的工作,這聽起來像是優化的對立面。有沒有人有任何推理,爲什麼0必須在那裏,它沒有它的工作,但在libC++中的每一個SFINAE例子似乎都明確地把0放在那裏,即使它們從不調用沒有參數的函數。

+0

我不知道確切原因,但可能會在調用表達式中不傳入「0」而不是假陰性時引發「模糊調用錯誤」 (因爲'...'版本與空默認參數匹配,而非默認不匹配) – 2014-10-18 19:33:40

+0

它與空指針分析沒有關係嗎?就像也許默認零禁用空指針的靜態分析,這反過來又避免運行鏗靜態分析器時的大量誤報。出於同樣的原因,也可能會稍微加快編譯速度。只是猜測...你應該問問llvm郵件列表(並回到這裏啓發我們;)) – Antoine 2014-11-07 09:00:29

回答

相關問題