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&引用类型