由于编译器无法在模板中推导模板参数的正确形式, 也就是模板参数的默认值在编译阶段是无法展现的....和Lambda中, 替代了旧版本中不好用的typeof
返回值: 在模板编程中, 我们不仅希望能自动推导参数类型, 还希望按照得到的类型来推导返回值, 如今可以借助尾置返回将模板函数写为下面的形式....(注意: 这里的尾置返回在C++14后已经不再必要, auto可以自动推断返回类型, 而且还能写出decltype(auto)了)
template...+为了右值引用在模板中引入了如下的引用折叠规则, 目的是针对上面的模板代码的情况, 如果推断的模板参数本身就带有引用, 叠加后需要消除多余的引用:
T& & -> T&
T& && -> T&
在折叠规则中可以看到不管实参是什么类型...尽管这里都是左值, 但是它们的声明类型依然是正确的, 我们想到可以利用转型来恢复它的引用属性
为了适配模板, 我们可以写出如下的模板函数. pass传入ref的参数只有int&和int&&两种类型, 且都是左值