c++ decltype和auto的区别

auto 是一个值类型
auto& 是一个左值引用类型
auto&& 是一个转发引用类型(符合引种折叠逻辑)

decltype(a) 是一个值类型
decltype((a)) 是一个左值引用类型
decltype(a + a) 是一个值类型
从以上写法来看auto和decltype用法功能是重叠的所以尽量用auto

但是auto有个限制,你需要在写下 auto 时就决定你写下的是个引用类型还是值类型。使用 auto 不能通用地根据表达式类型来决定返回值的类型
decltype(expr) a = expr;既可以匹配一个值类型也可以匹配一个引用类型
简化写法decltype(auto) = expr;

decltype(auto) i1 = a;      //i1是值类型
decltype(auto) i2 = std::move(a);  //i2是右值引用类型
decltype(auto) i3 = (s.a);    //i3是左值引用类型
decltype(auto) i4 = (0); //i4是值类型

注:
auto本质上匹配的是template func()的模板函数所以符合引用折叠的特点
int x = 42;
int& a = x;
int&& b = 42;
auto&& c = a; // int&
auto&& d = b; // int&
auto&& e = std::move(b); // int&&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值