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

时间:2015-11-13 10:40:10

标签: c++ templates c++11 language-lawyer

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 ++代码,标准中的位置可以找到吗?

1 个答案:

答案 0 :(得分:9)

我无法看到允许它的直接引用,但遗漏肯定是允许的:

  

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

因此,对于类模板和别名模板不允许这样做,但允许使用函数模板,因为可以从函数参数中推导出具有默认值的参数。