2015-11-13 170 views
8

C++ 11 introduced函數模板默認模板參數。另見Default template arguments for function templates非最後默認模板參數的函數模板

但是看完C++標準我找不到它是合法的定義函數模板,這對於第一個模板參數使用默認模板參數,而不是其他的模板參數。

這將是如何default arguments被處理,其中所有後續參數必須有提供的默認參數的相反;或者是一個功能參數包。

默認參數和默認模板參數之間的差別似乎很奇怪乍一看,但允許結構爲:

template <typename TException = std::exception, typename TObjectBuilder> 
auto SwallowExceptions(const TObjectBuilder& rObjectBuilder) -> decltype(rObjectBuilder()) 
{ 
    try 
    { 
     return rObjectBuilder(); 
    } 
    catch (const TException&) 
    { 
     return decltype(rObjectBuilder())(); 
    } 
} 

這是合法的C++代碼,並在標準的地方可以在此找到?

回答

8

我看不到直接引用這使得它,但它肯定是不作爲允許:

N3337 [temp.param]/11:如果一個類模板或別名模板的模板參數具有默認模板參數,每個隨後的模板參數應當要麼必須供給的缺省模板參數或爲模板參數 包。如果主類模板或別名模板的模板參數是一個模板參數包, 應當是最後一個模板參數。函數模板的模板參數包不得 接着另一個模板參數,除非該模板參數可以推斷或具有默認 參數(14.8.2)。

所以這是不允許用於類模板和別名模板,但允許功能模板作爲參數後面的那些默認值可以從函數參數推導出來。