因为在C++ primer的阅读过程中老是出现decltype,以前一直用auto比较多,所有就写个笔记好了。
auto类型说明符
C++11新标准中引入了auto类型说明符,auto类型说明符能让编译器替我们去分析表达式所属的类型,auto让编译器通过初始值推算变量的类型,因此auto定义的变量必须有初始值。
//由val1和val2相加的结果可以推断出item的类型
auto item = val1 + val2; //item初始化为val1和val2相加的结果
因为一条声明语句只能有一个基本数据类型,所以语句中所有变量的初始值基本类型数据都必须一样。
auto i = 0,*p = &i; //正确:i是整数、p是整形指针
auto sz = 0,pi = 3.14; //错误:sz和pi的类型不一致
当引用被用作初始值时,真正参与初始化的是引用对象的值。此时编译器以引用对象的类型作为auto类型的值。
int i = 0,&r = i;
auto a = r; //a是一个整数(r是i的别名,而i是一个整数)
auto一般会忽略顶层const(指针本身是个常量),底层const(指针所指对象是个常量)则会保留下来。
int i = 0;
const int ci = i,&cr = ci;
auto b = ci; //b是一个整数(ci的顶层const特性被忽略掉了)
auto c = cr; //c是一个整数(cr是ci的别名,ci的顶层const特性被忽略掉了)
auto d = &i; //d是一个整型指针(整数的地址就是指向整数的指针)
auto e = &ci; //e是一个指向整型常量的指针(对常量对象取地址是一种底层const)
C++ primer练习题2.35
判断下列定义推断出的类型是什么,然后编写程序进行验证。
const int i = 42;
auto j = i; const auto &k = i; auto *p =&i;
const auto j2 = i, &k2 = i;
j是一个整数,i的顶层const特性被忽略掉了
k是一个整型常量引用
p是一个整型常量指针
j2是const int类型
k2是const int类型的引用
decltype类型指示符
decltype是选择并返回操作数的数据类型,编译器分析表达式并得到它的类型,但是不实际计算表达式的值。
decltype(f()) sum = x; // sum的类型就是函数f的返回值
编译器不调用函数f,就是假定f被调用的话将会返回的那个类型
如果decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const和引用在内)
const int ci = 0, &cj = ci;
decltype(ci) x = 0; //x的类型是const int
decltype(cj) y = x; //y的类型是const int& , y绑定到变量x
decltype(cj) z; //错误:z是一个引用,必须初始化
如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型。
int i = 42,*p = &i,&r = i;
decltype(r+0) b; //正确:加法的结果是int,b是一个未初始化的int
decltype(*p) c; //错误:c是int&,必须初始化
如果decltype的表达式如果是加上了括号的变量,结果将是引用
decltype((i)) d; //错误:d是int&,必须初始化
decltype(i) e; //正确:e是一个未初始化的int