在 C 中,默认模板参数仅允许在类模板上使用,而不允许在函数模板上使用。这个限制可能看起来令人惊讶,但背后有几个原因。
默认模板参数允许类模板为某些参数提供默认值。当模板的大多数实例的默认值不太可能更改时,这会很有用。例如,排序算法的类模板可以为排序中使用的比较函数提供默认模板参数。
但是,函数不允许使用默认模板参数模板,因为它们会带来歧义。考虑以下假设示例:
<code class="cpp">struct my_class { template<class T = int> void mymember(T* vec) { // ... } };</code>
在此示例中,不清楚 T 是 mymember 函数还是 my_class 模板本身的默认类型。这种歧义可能会导致代码中出现微妙的错误。
在 C 11 之前,禁止函数模板使用默认模板参数是一个重大限制。然而,C 11 引入了一个称为“类型别名”的新功能,它允许我们为类型定义别名。这为函数模板缺少默认模板参数提供了一种解决方法。例如,上面的示例可以重写如下:
<code class="cpp">struct my_class { typedef int default_type; template<class T = default_type> void mymember(T* vec) { // ... } };</code>
虽然类型别名不如默认模板参数方便,但它们提供了类似的功能,并允许我们克服当前 C 标准的限制.
在一份缺陷报告中,C 的原始设计者 Bjarne Stroustrup 表达了他对禁止函数模板使用默认模板参数的看法:
禁止函数模板使用默认模板参数是独立函数被视为二等公民并要求所有模板参数从函数参数推导而不是指定的时代的错误遗留。
以上是为什么默认模板参数仅限于 C 中的类模板?的详细内容。更多信息请关注PHP中文网其他相关文章!