如果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是一个引用,必须初始化
因为cj是一个引用,decltype(cj)的结果就是引用类型,因此作为引用的z必须被初始化。需要指出的是,引用从来都作为其所指对象的同义词出现,只有用在decltype处是一个例外。
如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型。
//decltype的结果可以是引用类型
int i=42,*p=&i,&r=i;
decltype(r+0)b;//正确:加法的结果是int,因此b是一个(未初始化的)int
decltype(*p)c;//错误:c是int&,必须初始化
因为r是一个引用,因此decltype(r)的结果是引用类型。如果想让结果类型是r所指的类型,可以把r作为表达式的一部分,如r+0,显然这个表达式的结果将是一个具体值而非一个引用。另一方面,如果表达式的内容是解引用操作,则decltype将得到引用类型。正如我们所熟悉的那样,解引用指针可以得到指针所指的对象,而且还能给这个对象赋值。因此,decltype(*p)的结果类型就是int&,而非int。