内容摘自: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。


p__n
491 声望10 粉丝

科学告诉你什么是不可能的;工程则告诉你,付出一些代价,可以把它变成可行,这就是科学和工程不同的魅力。