首页 > 后端开发 > C++ > 正文

为什么 C 不能从默认函数参数推导出模板参数?

DDD
发布: 2024-11-05 09:14:02
原创
943 人浏览过

Why Can't C   Deduce Template Arguments from Default Function Arguments?

从默认函数参数推导模板参数

在 C 语言中,程序员经常遇到需要从函数调用推导模板参数的场景。但是,在某些情况下,这种推导可能会失败,从而导致编译器错误。其中一种情况是无法从默认函数参数推导模板类型参数。

考虑以下代码片段:

<code class="cpp">struct foo {
  template <typename T>
  void bar(int a, T b = 0.0f) {
  }
};

int main() {
  foo a;
  a.bar(5);
}</code>
登录后复制

编译此代码时,编译器可能会生成一个错误,指出, “无法推断出 T 的模板参数。”为了解决这个问题,需要在函数调用中显式指定模板参数,例如 a.bar(5)。但为什么编译器一开始就无法推导类型呢?

在 C 03 中,语言规范明确禁止使用默认参数来推导模板参数。根据 C 03 §14.8.2/17,“模板类型参数不能从函数默认参数的类型推导出来。”

在 C 11 中,该语言引入了一项新功能,允许提供默认值函数模板的模板参数:

<code class="cpp">template <typename T = float>
void bar(int a, T b = 0.0f) { }</code>
登录后复制

但是,默认模板参数是强制性的。如果未提供,编译器仍然禁止使用默认函数参数进行模板参数推导。 C 11 §14.8.2.5/5 指出:

“函数参数的参数类型中使用的模板参数,该函数参数具有默认参数,该默认参数正在执行参数推导的调用中使用”是非推导上下文。

总之,虽然为函数参数提供默认参数可以简化代码,但在这种情况下了解模板参数推导的局限性至关重要。如果显式提供了默认模板参数,则默认参数只能用于模板参数推导。

以上是为什么 C 不能从默认函数参数推导出模板参数?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!