c++11特性之一 模板(1) 模板函数的默认模板参数

c++11特性之一 模板(1) 模板函数的默认模板参数

在c++98中,由于实现的问题,编译器不支持模板函数的类型参数带默认值。这一特性在c++11中得到支持。

为什么引入

请看如下例子:

template<typename T>
void fun(T val = 0){
    cout<<val;
}

int main(){
    fun(1);//编译通过
    fun();//编译失败
}

可以看到,在main函数中实例化fun()函数时,由于编译器无法推导出T的类型,导致便以失败。因此,在c++11中为了解决这类问题,为模板函数的模板参数增加了默认值功能,使编译器在无法推导类型时,也能正常编译。

P.S.编译器仅根据实参推导类型,不会根据形参默认值推导!

如何使用

template<typename T=int>
void fun(T val = 0){
    cout<<val;
}

这样一来,编译器就会在无法推导类型时,使用int类型作为模板实例类型。

模板类型推导规则

优先级由高到低:

  1. 显式指定类型 ,如fun(10);
  2. 推导类型,如fun(3.14); 编译器将推导出float类型。
  3. 模板参数默认值,如fun(); 上例中默认为int。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注