首先auto型别推导与模板型别推导完全相同,也是按照前面说的三种情况进行推导,唯一的区别是在对大括号括起来的表达式进行推导时,auto会将其推导为一个std::initializer_list<T>的类型。代码示例如下:

auto x1 = 27;    //x1型别为int
auto x2(27);     //x2型别为int
auto x3 = {27};  //x3型别为std::initializer_list<int>
auto x4{27};     //x4型别为std::initializer_list<int>
auto x5 = {27,13,0.5};     //x5型别无法推导,编译报错,因为里面包含两种数据类型

请注意模板推导识别不了{ }类型,但是对于传入std::initializer_list<T>变量将被推导为int,如果函数模板本身就是std::initializer_list<T>型别,则可以顺利推导出{}型别:

template <class T> 
void func(T param)
{
    return;
}
template <class T> 
void func2(std::initializer_list<T> param)
{    
    return;
}
auto x1{27};     //x1型别为std::initializer_list<int>
func1(x1);    //T被推导为int
func2(x1);    //T被推导为int
func1({2,7});    //模板推导失败
func2({2,7});    //T被推导为int