笔记会持续更新,有错误的地方欢迎指正,谢谢!
模板实参推断
本章内容不重要,了解即可~
类型转换与模板类型参数
类型参数转换:通常不转换而是生成一个新的模板实例;有限可用的转换规则包括const转换和数组或函数指针转换;非模板类型参数正常转换。
函数模板显示实参
显式模板实参:在函数之后,实参列表前用尖括号提供显式实参;只有尾部的显式模板实参,并且可从函数参数推断出来的时候,才可忽略;显式指定的实参可正常类型转换。
尾置返回类型与类型转换
尾置返回类型:需要根据传入的参数确定返回类型时,可通过decltype推断形参作为返回类型,使用尾置返回类型格式返回。
标准库类型转换模板:定义在头文件type_traits
中,每个模板有一个公有成员type用于转换,不能转换时则返回模板参数类型本身;如remove_reference
可将T&、T&&、T转换为T。
函数指针和实参推断
函数指针:用函数模板初始化函数指针时,根据指针的类型推断模板实参;可以使用显式模板实参消除二义性。
模板实参推断和引用
引用折叠:间接创建引用的引用,除右值引用的右值引用折叠为右值引用,其他3种引用的引用都折叠为左值引用。
右值引用形参:可传给它任意类型的实参,若传引用也不改变左/右值属性;通常用于模板转发实参或模板重载;使用右值引用的函数模板通常重载绑定非const右值引用或const左值引用。
转发
转发:函数参数指向模板类型参数的右值引用,可保持对应实参的const属性和左/右值属性;进一步为解决接受右值引用参数不被理解为左值的问题,使用utility头文件中定义的forward,返回显式实参的右值引用,可保持实参类型的所有细节。
重载与模板
没啥有意义的的
可变参数模板
可变参数模板:接受可变数目参数的模板函数或模板类;class…、typename…、type-name…指定参数包,之后跟零个或多个参数,用sizeof…(args)获取参数个数;如template <typename… Args> void foo(const Args& … args)
中,Args是模板参数包,args是函数参数包。
可变参数函数模板:可变参数函数通常是递归的,非可变参数版本的声明必须在作用域内,否则无限递归。
包扩展:将一个包分解为多个元素,并对每个元素应用模式,通过在模式后添加省略号触发。