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),否则函数模板的模板参数包后不得再有另一个模板参数。
因此,这对于类模板和别名模板是不允许的,但对于函数模板是允许的,因为可以从函数参数推导出默认值之后的参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句