函数模板的非最后一个默认模板参数

Non-last default template arguments for function templates

本文关键字:参数 默认 最后一个 函数模板      更新时间:2023-10-16

C++11为函数模板引入了默认的模板参数。另请参阅函数模板的默认模板参数。

但是在阅读C++标准时,我没有发现定义一个函数模板是合法的,该模板使用默认模板参数作为第一个模板参数,而不使用其他模板参数。

这与默认参数的处理方式相反,在默认参数中,所有后续参数都必须提供默认参数;或者是功能参数包。

乍一看,默认参数和默认模板参数之间的区别似乎很奇怪,但允许以下构造:

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

这是合法的C++代码吗?在标准中的哪里可以找到?

我看不到允许它的直接报价,但它肯定是允许省略的:

N3337 [temp.param]/11:如果类模板或别名模板的模板参数具有默认模板参数,则每个后续模板参数应提供默认模板参数或为模板参数包装如果主类模板或别名模板的模板参数是模板参数包,它应该是最后一个模板参数。功能模板的模板参数包不应然后是另一个模板参数,除非该模板参数可以推导或具有默认值论点(14.8.2).

因此,这对于类模板和别名模板是不允许的,但对于函数模板是允许的,因为默认值后面的参数可以从函数参数中推导出来。