【问题标题】:Non-last default template arguments for function templates函数模板的非最后一个默认模板参数
【发布时间】:2016-02-14 22:10:09
【问题描述】:

C++11 introduced 函数模板的默认模板参数。另见Default template arguments for function templates

但是阅读 C++ 标准,我发现定义一个函数模板是合法的,它使用默认模板参数作为第一个模板参数,而不是其他模板参数。

这与default arguments 的处理方式相反,所有后续参数都必须提供默认参数;或者是一个函数参数包。

默认参数和默认模板参数之间的区别乍一看似乎很奇怪,但允许构造为:

template <typename TException = std::exception, typename TObjectBuilder>
auto SwallowExceptions(const TObjectBuilder& rObjectBuilder) -> decltype(rObjectBuilder())
{
   try
   {
      return rObjectBuilder();
   }
   catch (const TException&)
   {
      return decltype(rObjectBuilder())();
   }
}

这是合法的 C++ 代码吗?在标准中的什么地方可以找到?

【问题讨论】:

    标签: c++ templates c++11 language-lawyer


    【解决方案1】:

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

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

    所以这对于类模板和别名模板是不允许的,但对于函数模板是允许的,因为可以从函数参数中推断出跟随在默认值后面的参数。

    【讨论】:

      猜你喜欢
      • 2012-08-07
      • 2011-06-11
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      相关资源
      最近更新 更多