《Effective Modern C++》Item 2总结

本文深入探讨了C++中的auto关键字与模板参数类型推导之间的相似与不同之处,尤其关注它们在处理花括号形式数据时的行为差异。通过分析具体的代码实例,解释了auto如何将花括号形式数据转换为初始化列表,并强调了C++14对花括号形式数据推断的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先提出两个基本观点:

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形参类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值