码迷,mamicode.com
首页 > 编程语言 > 详细

《Effective Modern C++》Item 2总结

时间:2015-03-02 14:37:22      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

先提出两个基本观点:

1.auto和模板参数类型推导拥有几乎一模一样的规则,所以Item1总结的规则对于auto适用。

2.auto和模板参数了类型推导有一个不相同的地方,不同在于对于花括号的处理不同。为什么不同呢?王八屁股,规定!Scotter Meyer也不知道答案。

 

我们知道Item1 ,提出了三个不同的case:

1.类型描述符是指针或引用,并且不是全球通引用

2.类型描述符是全球通引用

3.类型描述符既不是指针,也不是引用

template<typename T> void f(ParamType param);

 



简单来看,我们可以把auto当成模板函数参数描述符里的 T。

const int x=5;

auto y=x;    //y is int.

auto yy= 5; //yy is int.

const auto cy = yy;

 

上面代码类型推导遵循case3,所有的auto类型都是int。

const auto& ry= yy;

 

上面代码遵循case1.

auto&& uref1 = x; // x is int and lvalue,
 // so uref1‘s type is int&
auto&& uref2 = cx; // cx is const int and lvalue,
 // so uref2‘s type is const int&
auto&& uref3 = 27; // 27 is int and rvalue,
 // so uref3‘s type is int&&

 

上面遵循case2.

 

不多说了,重点说下区别。

auto会把花括号形式数据,转换为初始化列表。

auto x3 = { 27 }; // type is std::initializer_list<int>,
 // value is { 27 }

 

而这样如下方式使用模板就是错误

template<typename T> // template with parameter
void f(T param); // declaration equivalent to
 // x‘s declaration
f({ 11, 23, 9 }); // error! can‘t deduce type for T

 

 

并且对于C++14来说,无法编译器无法推断花括号返回类型,包括函数和lambda。

也无法推断lamda的auto形参类型。

《Effective Modern C++》Item 2总结

标签:

原文地址:http://www.cnblogs.com/tangzhenqiang/p/4308546.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!