auto->decltype

auto

c++11标准才有的,c++14丰富了很多这个相关的用法

声明变量别用auto,auto是让编辑器来自己推断,很影响运行效率

#include<iostream>
using namespace std;

auto ave(int a, int b) {
	return a + b;
}

int main() {
	cout << typeid(ave(1, 2)).name()<<endl;
	return 0;
}

auto注意事项

auto保留不了const属性

auto优先推断为值而不是引用

auto的拖尾函数

当我们需要强制类型转换

decltype

int a = 10, b = 20;
cout << typeid(decltype(a+b)).name()<<endl;

decltype()可以保留const和引用

对于()里面没有一次运算的情况,int就转int,int&引用就转int&引用

引用对于()里面有至少一次运算的情况来说

1.看有没有固定地址,就是说是不是左值

decltype(a+b)是没有固定地址的,是暂存在寄存器中的,所有这个类型直接为int(就算为int& + int&)

int *pa{&a};
decltype(*pa) x = a;//经历了取值运算符,同时为左值,所以x为int&引用类型

//若里面是数组也行
pa[0];
pa[5]; //这也算经历了运算
//但是*pa + 1不行,没有固定内存了

decltype相较于auto的优点

然后()里面是函数

decltype(ave(100,200))编译器不会运行这个函数

auto->decltype

如果有时候自己搞不清楚函数的返回值

下面是c++11的写法

因为(a+b)/2没有固定地址所以是int类型

拖尾后面的表达式尽量和return里面的一样(防出错)

下面是c++14的写法

#include<iostream>
using namespace std;

decltype(auto) ave(int a, int b)
{
	return ((a + b) / 2);
}

int main() {
	decltype(ave(10, 20));
	return 0;
}

a++和++a的decltype()的区别

a++等价于a,a++是要当a被用过(这里面要被decltype用过)才++,所以先decltype,所以直接为int类型

++a(等价于a = a+1,这个表达的值就是a+1)相当于经历了运算,又有&a这个固定地址,所以为int&引用类型

decltype()另一个易错点

	int a = 1000;
	decltype(a) b; //b类型为int
	decltype((a)) c = a; //a类型为int&
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值