内容摘自:effective modern c++
auto推导几乎可以用模板类型推导的规则来解释,除了几个特殊情况。因此本文的目的一是介绍auto推导如何用模板类型推导规则来解释,二是介绍上述的几个特殊情况。
- auto类型推导
auto x = 27;
此表达式中产生的类型推导与如下的模板类型推导一致:
template<typename T>
void func_for_x(T param);
...
func_for_x(27)
类似的,
const auto& x2 = 27;
等效于:
template<typename T>
void func_for_x2(const T& param);
...
func_for_x2(27)
auto 相当于模板类型推导中的T,x左侧的类型说明部分相当于ParamType,赋值表达式右侧的部分相当于expr。这样的对照十分工整,模板类型推导中的三种情况和两个特例在这里都同样作用。
- 特殊情况
auto类型推导过程中,如果auto声明的变量用大括号初始化,则auto的类型会被推导为std::initializer_list<T>,T是大括号列表中变量的类型。例如:
auto x3 = { 27 };
//auto的类型是std::initializer_list<int>
这种情况如果发生在模板类型推导中会发生什么情况呢?
template<typename T>
void func(T param);
...
func({11,23,9});//error!无法为类型T推导类型。
如果函数要支持func({11,23})的形式,那么声明如下的函数模板:
template<typename T>
void func(std::initializer_list<T> param);
对于c++11标准来说,上述就是全部情况,但是c++14标准下故事还要继续,请看类型推导系列三:decltype。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。