1.模板的右尖括号
在泛型编程种,模板实例化有一个非常繁琐的地方,那就是连续的两个右尖括号(>>)会被编译器解析成右移操作,而不是模板参数表的结束,在C++11以前需要在>>之间加上一个空格> >。C++11之后就不需要再加上空格,改进了编译器的解析规则,尽可能的将多个右尖括号解析成模板参数结束符。
2.默认模板参数
c++11之前只允许对类模板提供默认参数,但是不支持函数模板的默认参数,c++11之后添加了函数模板的默认参数例如:
#include<iostream>
using namesapce std;
templete <typename T = int> //函数模板提供默认参数
void func(T t){
}
当所有模板参数都有默认参数时,函数模板的调用如同一个普通函数。但对于类模板而言,哪怕所有参数都有默认值,在使用也必须在类模板名后跟随<>来实例化。
如图对于存在默认参数的函数模板来说可以调用,而对于存在默认参数的类模板来说,还需要加上<>。
另外,函数模板的默认模板参数在使用规则上和其他的默认参数有一些不同,他没有必须写在参数表的最后的限制。
当默认模板参数和模板参数自动推导同时使用时候:
- 直接使用创建时给定的类型。
- 如果可以推导出参数类型则使用推导出的类型。
- 如果函数模板无法推导出参数类型,那么编译器会使用默认模板参数。
- 如果无法推导出模板参数类型并且没有设置默认模板参数,编译器就会报错。
--------------------------------------------------------------------------------
如果上述有错欢迎大家指正。