c++11的类型推导auto使用
c++11新特性,最先提到的肯定是类型推导,c++引入了auto和deltype关键字,使用他们在编译期就能推导出变量或者表达式的类型,方便开发也简化代码。
一、auto:
auto可以让编译器在编译期就推导出变量的类型,auto基本用法,类似.NET中的var
auto a=1; //1是int,可以自动推导出a是int
int b=2;
auto c=b;//推导出c是int类型
auto d=2.0;//d是double类型
auto的使用规则:
1)auto使用时必须马上初始化,否则无法推导出类型
2)auto在一行定义多个变量,各变量推导不能产生二义性,否则编译失败,意思就是多个变量类型保持一致
3)auto不能定义数组,可以定义指针
4)在类中auto不能用作非静态成员变量
5)auto不能用作函数参数
6)auto无法推导出模版参数
auto j;//错误,auto使用必须马上初始化
auto d=0,f=1.0;//报错 error,d,e不是同种类型,对于编译器有二义性,没法推导
int i=1;
auto a=i,&b=i,*c=&i;//a是int,b是i的引用,c是指针,auto就相当于int
函数中auto使用规则
void func(auto value) {} // error,auto不能用作函数参数
class A {
auto a = 1; // error,在类中auto不能用作非静态成员变量
static auto b = 1; // error,这里与auto无关,正常static int b = 1也不可以
static const auto c = 1; // ok
};
void func2() {
int a[10] = {0};
auto b = a; // ok
auto c[10] = a; // error,auto不能定义数组,可以定义指针
vector<int> d;
vector<auto> f = d; // error,auto无法推导出模板参数
}
int i = 0;
auto *a = &i; // a是int*
auto &b = i;//b是int&
auto c = b;//c是int,忽略了引用
const auto d = i;//d 是const int
auto e = d;//e是int
const auto& f = e;//f是const int&
auto &g = f;//g是const int&
auto与const和volatile的结合使用方法:
1)在不声明为引用或指针时,auto会忽略等号右边的引用类型和cv限定
2)在声明为引用或者指针时,auto会保留等号右边的引用和cv属性
二、decltype
auto用于推导变量类型,而decltype则用于推导表达式类型,这里只用于编译器分析表达式的类型,表达式实际不会进行运算,代码:
int func(){return 0;}
decltype(func()) i;//i为int类型
int x=0;
decltype(x) y;//y是int类型
decltype(x+y) z;//z 是int类型
注意:decltype不会像auto一样忽略引用和cv属性,decltype会保留表达式的引用和cv属性
const int &i = 1;
int a = 2;
decltype(i) b = 2; // b是const int&
decltype推导规则
对于decltype(exp)有
1)exp是表达式,decltype(exp)和exp类型相同
2)exp是函数调用,decltype(exp)和函数返回值类型相同
3)其它情况,若exp是左值,decltype(exp)是exp类型的左值引用
int a = 0, b = 0;
decltype(a + b) c = 0; // c是int,因为(a+b)返回一个右值
decltype(a += b) d = c;// d是int&,因为(a+=b)返回一个左值
d = 20;
cout << "c " << c << endl; // 输出c 20