论c++中的auto和decltype

因为在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
发布了14 篇原创文章 · 获赞 3 · 访问量 1777

猜你喜欢

转载自blog.csdn.net/qq_44708426/article/details/105604650