为什么不能从默认函数参数中推导出模板类型参数
在 C 中,一个常见的误解是编译器可以推导出模板类型参数来自默认函数参数。然而事实并非如此。
当遇到以下代码时:
<code class="cpp">struct foo { template <typename T> void bar(int a, T b = 0.0f) { } }; int main() { foo a; a.bar(5); // Error: could not deduce template argument for T }</code>
编译器无法从默认参数 0.0f 推导出类型 T。相反,它需要明确的规范,如 a.bar
C 03 禁止
在 C 03 中,语言规范明确禁止使用模板参数推导的默认函数参数 (C 03 §14.8.2/17):
A template type-parameter cannot be deduced from the type of a function default argument.
C 11 默认模板参数
在 C 11 中,一种解决方法出现:引入默认模板参数。通过修改代码如下:
<code class="cpp">template <typename T = float> void bar(int a, T b = 0.0f) { }</code>
提供了默认的模板参数T。但是,应该注意的是,拥有默认模板参数并不能减轻对默认函数参数的限制。
根据 C 11 14.8.2.5/5,默认函数参数被视为“非推导上下文”模板参数推导过程。这意味着编译器无法使用函数参数的默认值来推断模板类型参数。
结论
虽然默认函数参数提供了便利,但模板类型参数不应该从他们身上推断出。对于需要默认值的情况,默认模板参数提供了更便携、更灵活的解决方案。
以上是为什么不能从 C 中的默认函数参数推导出模板类型参数?的详细内容。更多信息请关注PHP中文网其他相关文章!