decltype 关键字

decltype

有的时候我们还会遇到这种情况,我们希望从表达式中推断出要定义变量的类型,但却不想用表达式的值去初始化变量。还有可能是函数的返回类型为某表达式的值类型。在这些时候auto显得就无力了,所以C++11又引入了第二种类型说明符decltype,它的作用是选择并返回操作数的数据类型

decltype(var)

当使用decltype(var)的形式时,decltype会直接返回变量的类型(包括顶层const和引用),不会返回变量作为表达式的类型。

const int ci = 0,&cj = ci;
decltype(ci) x = 0; //x类型为const int
decltype(cj) y = x; //y类型为const int &

decltype加指针也会返回指针的类型。decltype加数组,不负责把数组转换成对应的指针,所以其结果仍然是个数组(P206)。

decltype(expr)

当使用decltype(expr)的形式时,decltype会返回表达式结果对应的类型。一个表达式的结果不是 ** 左值 ** ,就是 ** 右值 **。
因此,decltype(expr)的结果根据expr的结果不同而不同:expr返回左值,得到该类型的左值引用;expr返回右值,得到该类型。

int i = 43,*p = &i,&r = i;

//r + 0 是一个表达式 返回右值
// b是一个int 类型
decltype(r + 0) b;

decltype(*p)c = i; //c 是一个int &

变量作为表达式形式
要想获得变量作为表达式的类型,可以加一个括号:

int i = 42;
//加上括号,变成表达式
decltype((i)) ri = i;

int *p = &i;
decltype((p)) temp = p; //指向int类型的指针的引用。

decltype(function)

C++中通过函数的返回值和形参列表,定义了一种名为函数类型的东西。它的作用主要是为了定义 ** 函数指针 **。

using FuncType = int (int&,int);
int add_to(int&des,int origin);

FuncType *pf = add_to;
int a = 4;
pf(a,2);
decltype(add_to) * pf = add_to;

这样的声明就简单多了。

当使用decltype(func_name)的形式时,decltype会返回对应的函数类型,不会自动转换成相应的函数指针。

posted on 2021-06-15 18:26  Ultraman_X  阅读(61)  评论(0编辑  收藏  举报

导航