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

dal*_*lle 8 c++ templates language-lawyer c++11

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())();
   }
}
Run Code Online (Sandbox Code Playgroud)

这个合法的C++代码和标准中的位置可以找到吗?

Tar*_*ama 9

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

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

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