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