auto和decltype

auto和decltype

auto型别推导

除了用于auto声明变量的初始化表达式是使用大括号时,auto的型别推导和模板的型别推导完全一样。
在模板型别推导和采用auto声明变量时:

template<typename T>
void f(ParamType Param);
f(expr);

auto x = 10;
const auto cx = x;
const auto& rx = x;

auto扮演了模板中T的角色,而变量的型别饰词则等同于ParamType。所以,auto 声明变量时同样有三种情况:

  • 型别饰词是指针或引用,但不是万能引用
  • 型别饰词不是指针也不是引用
  • 型别饰词是万能引用
auto x = 10; //型别饰词不是指针也不是引用
const auto cx = x; //型别饰词不是指针也不是引用
const auto& rx = x; //型别饰词是指针或引用,但不是万能引用
auto&& y1 = x; //型别饰词是万能引用,x是左值,型别为int&
auto&& y2 = cx; //型别饰词是万能引用,cx是左值,型别为int&
auto&& y3 = 10; //型别饰词是万能引用,10是右值,型别为int&&

同样,以数组名和函数来进行初始化时,情况也和模板型别推导一致:它们会退化成为指针,除非是用来初始化引用

特殊情况:用于auto声明变量的初始化表达式是使用大括号时

当用于auto声明变量的初始化表达式是使用大括号时,auto推导得出的型别是属于std::initializer_list

auto x = {1,2,3};//编译通过
auto x = {1,2,3.5};//编译不通过

上一行代码在编译时,x首先推导为std::initializer_list,此时进入第二次推导,而{}中值的型别不一样,所以编译失败

template<typename T>
void f(T param);
f({1,2,3});
//编译失败
template<typename T>
void f(std::initializer_list<T> param);
f({1,2,3});
//编译成功

从上面代码可以看出,template类型推导不会把{}初始化表达式推导为std::initializer_list

函数返回值和lambda式的形参

在函数返回值和lambda式的形参使用auto时,使用的是模板型别推导,而不是auto型别推导


持续更新中。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值