1、auto类型说明符号
auto类型说明符号是C++11新标准引入的类型说明符号,用于让编译器替程序员去分析表达式所属的类型,以下便记录auto关键字的用法与注意点。
(1)auto定义的变量必须有初始值
因为auto让编译器通过初始值来推算变量的类型,所以auto定义的变量必须有初始值。
int i = 1; int &j = i;
auto val0 = 0, *p = &i; //正确
auto val1; //错误
auto val2 = 0, val3 = 3.0; //错误,val2,val3的类型不一致
auto val4 = i; //正确,i是整数j的引用,此时val4的类型是整型
(2)auto与const
auto一般会忽略掉顶层const,而底层的const则会保留下来。
const int i = 0, &j = i;
auto a = i, b= j; //a,b都是整数,不是常量
auto c = &a; //c是一个整型指针,
auto d = &i; //d是一个指向整数常量的指针(对常量取地址相当于int* const,为底层const)
(3)auto与引用
可以将引用的类型设置为auto,此时的初始化规则和引用的一样。
int i = 0;
auto &a = i; //正确
auto &b = 0; //错误,不可以为非常量绑定字面值
const auto &c = i; //正确,c为常引用
(4)auto与动态分配
可以用auto来推断初始化器的类型,但是只有当初始化器中的类型是单一的时候才行。
auto p1 = new auto(obj); //正确,此时p1是obj类型的指针类型,obj*
auto p2 = new auto{a,b,c}; //错误,不与花括号一起使用,并且括号中只能有一个初始化器
auto不能用于分配数组
auto arr[] = { 1,2,3 }; //错误,auto不能出现在顶级数组类型中
(5)auto与函数声明与尾置返回类型
尾置返回类型也是C++11新标准引入的,任何函数声明都可以使用尾置返回类型,对于返回类型比较复杂的函数比较有效,比如返回类型是数组的指针或者数组的引用,在返回类型处可以用auto代替。
auto func(int i) -> int(*)[10];
func接受一个int类型的实参,返回一个指针,该指针指向含有十个整数的数组
2、decltype类型说明符号
decltype类型说明符号是C++11新标准引入的类型说明符号,与auto的区别为:在只想推断出表达式的类型,但是不想用其值进行初始化的时候,用decltype。
(1)decltype定义的变量可以不初始化
decltype(f()) a; //正确,decltype定义变量可以没有初始值,类型为函数f()的返回值类型
(2)decltype与const
const int a = 0, &b = a;
decltype(a) c = 0; //正确,c的类型为const int
decltype(b) d = c; //正确,d的类型为const int&
decltype(b) e; //错误,e的类型为const int&,必须初始化
从上面的例子可以看到,decltype不会忽略顶层的const,而是保留,这是和auto的一个区别。
(3)decltype与引用
在上面已经知道decltype计算出来的类型可以是引用,现在来看几个和引用、指针的例子
int i = 1, *p = &i, &r = i;
decltype(*p) a = i; //decltype推断出的*p的类型是引用,因此a的类型是int&,必须初始化
decltype(r+0) b; //r的类型是引用,但是r+0表达式计算之后返回的类型是int,因此b的类型是int,可以没有初始值。
(4)decltype与括号
decltype内层如果有多层括号,那推断出的类型必定是引用类型,必须有初始值。
int i = 0;
decltype((i)) a;//错误,a的类型是int&,必须初始化
(5)decltype与函数返回类型
decltype可以用于函数的返回类型定义处。
int odd[] = {1,3,5,7,9};
int even[] = {0,2,4,6,8};
decltype(odd) *arrptr(int i)
{
return (i%2) ? &odd : &even;
}
上述的例子中,decltype(odd)的类型是整型数组(decltype不负责把数组类型转化成指针),而后的*号则表示返回值是指向一个整型数组的指针。
总结
C++11提供的auto和decltype类型说明符号,可以简化在定义变量,函数返回类型和推断表达式值的类型等可以提供很大的便利。