函数模板的非最后一个默认模板参数
Non-last default template arguments for function templates
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).
因此,这对于类模板和别名模板是不允许的,但对于函数模板是允许的,因为默认值后面的参数可以从函数参数中推导出来。
相关文章:
- 使函数参数默认为周围范围
- 如何将值传递给其参数(默认参数)
- 当“std::make_index_sequence”和“std::index_sequence”用于模板参数默认类型时
- C ,构造器中允许的参考参数默认值
- 哪些规则控制参数默认赋值?
- 错误:上一个规范后给出的参数默认参数
- 是否可以设计一个包含模板参数默认值的类
- 构造函数中参数C++默认值
- 如何设置依赖于其他参数的参数默认值
- C++模板参数默认函数实现
- QInput对话框参数默认值
- g++4.8.2上列表方法参数默认初始化时出错
- 在函数定义中指定参数默认值会导致错误 C2143:语法错误:'='之前缺少')'
- 函数模板:将第一个模板参数默认为第二个
- 模板模板参数默认可以引用其他模板类型的参数
- 参数默认为先例参数的值
- 如何修改一个类,使它只有一个成员函数,所有参数默认
- 内置类型的模板参数默认值
- 是否可以使用构造函数或对象作为其他类方法的参数默认值?
- 模板参数默认为更高版本