从零单排c++ primer(20)

(1)如果函数参数类型不是模板参数,则对实参进行正常的类型转化。
(2)当我们用一个函数模板初始化一个函数指针或为一个函数指针赋值时,编译器使用指针的类型来推断模板实参。
(3)当参数是一个函数模板实例的地址时,程序上下文必须满足:对每个模板参数能唯一确定其类型或值。
(4)当一个函数参数是模板类型参数的一个普通引用时,绑定规则告诉我们,只能传递给它一个左值。
(5)如果一个函数参数的类型是const T&,正常的绑定规则告诉我们可以传递给它任何一个类型的实参,一个对象,一个临时对象或是一个字面值常量。
(6)引用折叠只能应用于间接创建的引用的引用,如类型别名或模板参数。
(7)如果一个函数参数是指向模板参数类型的右值引用,则可以传递给它任意类型的实参。如果将一个左值传第一个这样一个参数,则函数参数被实例化为一个普通的左值

          引用。
(8)标准库中move的定义

 

                template <typename T>
                typename remove_reference <T>::type&& move(T&& t)
                {
                    return static_cast<typename remove_reference<T>::type&&>(t);
                }


(9)虽然不能隐式地将一个左值转换为右值引用,但可以用static_cast显示的将一个左值转换为一个右值引用。
(10)如果一个函数参数是指向模板类型参数的右值引用,它对应的实参的const属性的左值/右值属性将得到保持。
(11)当一个指向模板参数类型的右值引用函数参数时,forward会保持实参类型的所有细节。
(12)函数模板可以被另一个模板或一个普通非模板函数重载,与往常一样,名字相同的函数必须具有不同数量或类型的参数。
(13)正确定义一组重载的函数模板需要对类型间的关系及模板函数允许的有限实参类型转换有深刻的理解。
(14)当有多个重载模板对一个调用提供同样好的匹配时,应选择最特例化的版本,没有这条规则,传递const的指针的调用永远是有歧义的。
(15)对于一个调用,如果一个非函数模板与一个函数模板提供同样好的匹配,则选择非模板版本。
(16)在定义任何函数之前,记得声明所有重载的函数版本。这样就不必担心编译器由于未遇到你希望调用的函数而实例化一个并非你所需要的版本,
(17)一个可变参数模板就是一个接受可变数码参数的模板函数或模板类。
(18)可变数目的参数被称为参数包,存在两种参数包:模板参数包,表示零个或多个模板参数,函数参数包,表示零个或多个函数参数。
(19)用省略号来指出一个模板参数或函数参数表示一个包。
(20)当我们需要知道包中有多少元素时,可以使用sizeof...运算符。

你可能感兴趣的:(C++,学习,VC,C++Primer)