decltype类型指示符

一、关键词

  • 从表达式的类型推断出要定义的变量的类型

  示例:decltype(i) x = 0;    //等价于int x = 0;

二、复合类型、const

	const int ci = i, &cj = ci;
	decltype(ci) x = 0;		//保留顶层const,x的类型是const int 
	decltype(cj) y = x;		//y的类型是const int &,而不是ci的类型,y绑定到变量x 
	decltype(cj) z;			//错误:z是一个引用,必须初始化

1. 引用

  和auto不同,当表达式为一个引用别名时,它不会将类型声明为该别名所绑定的对象的类型,而是保留为引用的类型

2. const

  和auto不同,它可以保留顶层const

三、decltype和引用

如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型。

注:有些表达式会向decltype返回一个引用类型,这一般意味着该表达式的结果对象可以作为一条赋值语句的左值

1. 如果表达式的内容是解引用操作,则decltype将得到引用类型。

如:int i = 3, *p = &i;  decltype(*p) c = i;    //c是int &,必须初始化

2. 如果给变量加上一层或多层括号,编译器会把它当作一个表达式,同样会得到引用类型。

如:decltype((i)) d = i;      //d是int &,必须初始化

【补充】

举例:使用关键字decltype的时候,其表达式的求值结果若是左值,decltype作用于该表达式(不能是变量)得到一个引用类型。例如,p的类型是int *,因为解引用运算符生成左值,所以decltype(*p)的结果是int &。而另一方面,因为取地址运算符生成右值,所以decltype(&p)的结果是int **,即结果是一个指向整型指针的指针。

原文地址:https://www.cnblogs.com/xzxl/p/7651426.html