2015-11-13 208 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)。

所以这是不允许用于类模板和别名模板,但允许功能模板作为参数后面的那些默认值可以从函数参数推导出来。