decltype
的功能和auto
相同,都用来在编译时期进行自动类型推导。
两者区别如下:
auto varname = value;
decltype(exp) varname = value;
- auto根据
=
右边的初始值value
推导出变量的类型。 - decltype根据
exp
表达式推导出变量类型,跟=
右边的初始值value
没有关系。
举例:
decltype(10.8) x = 5.5; //x 被推导成了 double
decltype(x+100) y; //y 被推导成了 double
decltype 推导规则
decltype(exp) varname;
① 如果exp
是一个不被括号()
包围的表达式,那么 decltype(exp) 的类型就和 exp 一致,这是最普遍最常见的情况。
int n = 0;
decltype(n) a = n; //n 为 int 类型,a 被推导为 int 类型
② 如果exp
是函数调用,那么decltype(exp)的类型就和 函数返回值 的类型一致。
int& func_int_r(int, char); //返回值为 int&
decltype(func_int_r(100, 'A')) a = n; //a 的类型为 int&
③ 如果 exp 是一个左值,或者被括号()
包围,那么 decltype(exp) 的类型就是 exp 的引用。
int n = 0;
decltype((n)) a = b; //带有括号,符合推导规则三,a 的类型为 int&。
decltype 的实际应用
auto 的语法格式比 decltype 简单,所以在一般的类型推导中,使用 auto 比使用 decltype 更加方便。
但是,auto 只能用于 类的静态成员,不能用于 类的非静态成员(普通成员),如果我们想推导 非静态成员的类型,这个时候就必须使用 decltype 。