条款2、理解auto型别推导
对于auto的型别推导而言,其中大部分情况和模板型别推导是一模一样的。只有一种特例情况。
我们先针对auto和模板型别推导一致的情况进行讨论:
//某变量采用auto来声明的时候,其中auto就扮演了模板中的T这个角色,而变量的型别修饰词则对应函数形参param
auto x = 27;//其中T对应auto、param也对应auto
const auto cx = x;//T对应auto,param对应const auto
const auto& rx = x; //param对应const auto&
而对于auto与模板的区别主要在于大括号的使用上:
//对于auto而言
auto x{27};
auto x = {27};
//这两种方式都是声明了类型为std::initializer_list<int> 含有单个值为27的元素。
auto x = {0.1,1,2}//大括号里面的类型不一样,无法推导,所以这种声明方式会报错。
//对于模板而言
template<typename T>
void f(T param)
f({11,23,9})//报错,就算类型一致,模板型推导也不会推导成std::initializer_list<int>这个点为两者的区别所在
除此之外,对于函数的返回值,和lambda表达式的形参,在c++14中auto可以充当关键字,但是要注意的是此时的auto使用的推导方式是模板方式。也就是说返回值不能用大括号括起来。
条款3、理解decltype
1、其实对于decltype,没什么需要多说的。他就像当与一只鹦鹉。你给他什么,他就说什么。当然虽然有时候他的话也会让你大吃一惊。不过那也只是特例。
主要需要新学习的是c++11中的返回值型别尾序语法,可能您见过,或者很熟悉。
例如:
template<typename Container, typename Index> auto authAndAccess(Container& c, Index i) ->decltype(c[i]) { authenticateUser();
return c[i]; }
该函数的返回值类型在最后,这样做的好处是在指定返回值类型的时候可以用到函数形参。
在c++14中这种用法可以用auto来替代但是因为auto的推导型别和模板类似在条款1中有说明,会忽略形参引用。
但是c++中 使用decltype(auto) 来代替auto作为函数返回值,完美的解决了这个问题。
2、对于参数是表达式的情况下,decltype的返回值总会是引用类型。比如:
int x;
decltype((x))//返回值结果为int&