从默认函数参数推导模板参数
在 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
在 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中文网其他相关文章!