对于传数组,由于c中数组和指针是等价的,因此,数组通过值传递的时候被视为一个指针,模板推导出来也是一个指针。然而,当作为引用传递的时候,其就不和指针等价了,可以推导出其类型和大小。
但实际上,这两个传进去的东西用起来是一样的。都是函数()。
template<typename T>
void f(ParamType param);
ParamTypeOfAuto param;
这两个实际上是等价的,除了一种情况。
当使用{}初始化的时候,auto会默认为std::initialize_list,而模板推导则不会默认,模板推导接受{}是必烂的。而如果是构造,如果这个{}能够符合两个类型的构造,那么就是歧义的。
返回类型的auto和lambda的形参auto虽然看着是auto,但实际上使用的规则是模板推导的规则而非auto的规则。
另外,lambda的形参使用auto相当于就是模板函数。
使用auto能够让类型上的依赖自动推导,不用牵一发而动全身。
decltype不是类型推导,decltype会忠诚的返回变量本身的类型。
然而,对于一个非引用值来说,如果他是复杂的表达式,即便是(param),param是T类型,也会让整个类型的推导变为T&。
由于auto是类型推导,为了让其使用decltype的规则,就应该使用decltype(auto),这个时候会把推导方法使用decltype的规则。