让我们有下面的代码
auto x = { 11, 23, 9 };
template<typename T> // template with parameter
void f(T param);
f({ 11, 23, 9 }); // error! can't deduce type for T
而模板不会自动推导出在这里,在下面的代码auto
自动推导。
auto
类型推断?auto
类型?auto
类型推演通常是相同的模板类型推演,但auto
类型推演假定一个支撑初始化表示std::initializer_list
和模板类型推演没有。
当auto
声明的变量与一个支撑初始化初始化,推导的类型是std::initializer_list
的实例化。但是,如果相应的模板传递相同的初始化,类型推演失败,并且代码被拒绝:
auto x = { 11, 23, 9 }; // x's type is
//std::initializer_list<int>
template<typename T> // template with parameter
void f(T param); // template with parameter
但是,如果在模板中指定参数是某些未知T A std::initializer_list<T>
,模板型扣将演绎T是什么:
template<typename T>
void f(std::initializer_list<T> initList);
f({ 11, 23, 9 }); // T deduced as int, and initList's
// type is std::initializer_list<int>
记得
- 汽车类型推演通常是相同的模板类型推演,但自动类型推演假定一个支撑初始化表示
std::initializer_list
和模板类型推演没有。
Auto type deduction采取不同的规则列表初始化。随着副本列表初始化,模板参数P被视为std::initializer_list<U>
。
(重点煤矿)
在T,声明的类型,其包括自动可变的,自动的每次出现替换假想类型模板参数U或,如果初始化是复制列表初始化,与
std::initializer_list<U>
:参数P如下获得。的参数A是初始化表达式。
那么对于auto x = { 11, 23, 9 };
,x
的类型将是std::initializer_list<int>
。
对于直接列表的初始化,规则是不同的,因为:
在直接列表初始化(但不是在复制列表initalization),推断从支撑-初始化列表自动的意义时,该支撑-初始化列表只能包含一个元素,和经销商的类型将是该元素的类型:
auto x1 = {3}; // x1 is std::initializer_list<int> auto x2{1, 2}; // error: not a single element auto x3{3}; // x3 is int // (before N3922 x2 and x3 were both std::initializer_list<int>)