1.当调用一个函数模板时,编译器用函数实参来推断模板实参,并实例化一个特定版本的函数;也可以提供显示模板实参。
2.除了定义类型参数,还可以在模板中定义非类型参数,我们通过一个特定的类型名来指定非类型参数;实例化时,非类型参数被用户提供的或编译器推断的值代替,这些值必须是常量表达式。
3.默认情况下,一个类模板的成员函数只有当程序用到它时才实例化
4.显示实例化可以避免多个文件实例化相同模板的额外开销。当编译器遇到external模板声明时,它不会在本文件生成实例化代码;一个类模板的实例化定义会实例化该模板的所有成员。
5.理解std::move
template<typename T>
typename remove_reference<T>::type&& move(T&& t){
return static_cast<remove_reference<T>::type&&>(t);
}
当传递给move的实参是右值时,T的推断类型为实参的类型,remove_reference<T>::type依然是实参的类型,返回的是实参的右值引用
当实参是左值时,T的推断类型为实参类型的左值引用,remove_reference<T>::type是实参的类型,返回的是实参的右值引用
6.函数匹配时,如果多个模板同样好的匹配,选择更特例化的模板。
7.class...或typename...表示可变参数模板,编译器从函数实参推断参数数目;sizeof...返回实参数,不会对实参求值;我们可以对参数包中的每个元素应用模式。
8.我们可以为模板定义特例化版本。函数模板的特例化版本本质上是一个实例,而非函数名的一个重载版本。因此,特例化不影响函数匹配。