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

给她

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用默认参数的C ++函数模板

来自分类Dev

Lambda作为成员函数模板的默认参数

来自分类Dev

为不同版本的函数模板识别不同的默认参数

来自分类Dev

C ++错误:函数模板中可能未使用默认模板参数

来自分类Dev

C ++错误:函数模板中可能未使用默认模板参数

来自分类Dev

如何在非变量模板类中形成可变参数模板函数?

来自分类Dev

如何在非变量模板类中形成可变参数模板函数?

来自分类Dev

可变参数模板循环,非递归

来自分类Dev

非静态成员函数模板的地址

来自分类Dev

没有模板参数的可变参数模板函数

来自分类Dev

递归可变参数函数模板

来自分类Dev

编写可变参数模板构造函数

来自分类Dev

类型受限的可变参数模板函数

来自分类Dev

可变参数模板函数接受lambda

来自分类Dev

函数模板内部的参数推导

来自分类Dev

如何传递可变参数模板函数?

来自分类Dev

可变参数模板函数接受lambda

来自分类Dev

如何重载可变参数模板函数?

来自分类Dev

重载函数模板和继承的参数

来自分类Dev

可变参数模板函数重载失败

来自分类Dev

如何使函数模板成为测试的参数?

来自分类Dev

可变参数模板中的函数顺序

来自分类Dev

模板参数上的C ++函数模板重载

来自分类Dev

函数模板中返回类型的模板参数推导

来自分类Dev

可变参数模板参数必须始终为最后吗?

来自分类Dev

函数的默认模板参数被忽略

来自分类Dev

不存在的标识符用作未实例化的函数模板中的默认参数

来自分类Dev

函数模板:默认第一个模板参数为第二个

来自分类Dev

函数模板:默认第一个模板参数为第二个

Related 相关文章

热门标签

归档