对于使用过部分C++11特性的朋友,应该已经知道了C++11后auto与以前不同了,可以进行自动类型推断,但这自动类型推断是需要进行初始化或者赋值的。这样说,有时候或许我们需要的只是那个表达式的类型,但不需要那个表达式的值,那用auto岂不是多了一步不必要的工作了?由此,我们就能引出今天的主题了——decltype类型指示符。
正如上面所说,decltype仅仅只是获取表达式的类型,但不会去计算其值,举个例子来说明其使用方法:
int val1 = 100; //定义一个int型变量
decltype(val) val2; //获取val1的类型,并定义val2
如此,我们定义的val2的类型就是val1的类型。如果decltype使用的表达式并不是一个变量,则decltype得到的类型则为那个表达式的值的类型。
通过上面的描述,我们都知道了decltype可以进行类型推断,那它只能推断基本类型么?当然不是!decltype还可以对复合类型进行推断,比如指针,引用等。下面我们再看一个例子:
int val = 100;
int *p_val = &val;
int &r_val = val;
decltype(r_val + 1) a; //正确,r_val + 1为一个int型常量
//decltype 得到一个int类型
decltype(*p_val) b; //错误,*p_val是解引用操作
//按约定,decltype得到的应该
//是一个int &类型,b是引用应该被初始化
还有一种情况需要说明,对于decltype括号中的表达式,加括号和不加括号将可能是两种不同的结果,如:
decltype((val)) a; //错误,decltype得到int &类型
decltype(val) b; //正确,decltype得到int类型
对于decltype大致的内容大概就是这些,使用时应该特别注意返回的类型是否为引用类型,切记:双层括号的decltype得到的必为引用类型!