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 ++代码,标准中的位置可以找到吗?
答案 0 :(得分:9)
我无法看到允许它的直接引用,但遗漏肯定是允许的:
N3337 [temp.param]/11:
如果类模板或别名模板的模板参数具有默认模板参数,则每个后续模板参数应具有提供的默认模板参数或者是模板参数 pack。如果主类模板或别名模板的模板参数是模板参数包, 它应该是最后一个模板参数。函数模板的模板参数包不得 后跟另一个模板参数,除非可以推导出该模板参数或具有默认值 论证(14.8.2)。
因此,对于类模板和别名模板不允许这样做,但允许使用函数模板,因为可以从函数参数中推导出具有默认值的参数。