让我们有以下代码
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类型是什么?发布于 2019-02-01 09:52:37
auto类型演绎通常与模板类型演绎相同,但auto类型演绎假定带括号的初始化器表示std::initializer_list,而模板类型演绎则不表示std::initializer_list。
当用带括号的初始化器初始化auto-declared变量时,推导的类型是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但是,如果在模板中指定param是某个未知T的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,而模板类型演绎则不表示。发布于 2019-02-01 10:01:54
自动类型演绎对列表初始化采用不同的规则。对于复制列表初始化,模板参数P被认为是std::initializer_list<U>.
(强调地雷)
参数p如下:在T中,包含auto的变量的声明类型,每次auto的出现都被替换为假想类型的模板参数U或,如果初始化是复制列表初始化,则用
std::initializer_list<U>.替换为。参数A是初始化表达式。
那么对于auto x = { 11, 23, 9 };,x的类型将是std::initializer_list<int>。
对于直接列表初始化,规则是不同的:
在直接列表初始化(但不在复制列表-initalization中)中,当从大括号-init-列表中推导出汽车的含义时,带括号的-init-列表必须只包含一个元素,并且auto的类型将是该元素的类型: auto x1 = {3};// x1是std::initializer_list auto x2{1,2};//错误:没有单个元素自动x3{3};// x3是int // (在N3922 x2和x3都是std::initializer_list之前)
https://stackoverflow.com/questions/54476870
复制相似问题