decltype + 变量
当使用decltype(变量)
的形式时,decltype会直接返回变量的类型(包括顶层const和引用)。
const int ci = 0, &cj = ci;
decltype(ci) x = 0; // 定义了x, x的类型是const int
decltype(cj) y = x; // 定义了y, y的类型是const int &
decltype + 表达式
当使用decltype(表达式)的形式时,decltype会返回表达式结果对应的类型。decltype
不会去真的求解表达式的值。
decltype(表达式)的结果根据expr的结果不同而不同:expr返回左值,得到该类型的左值引用;expr返回右值,得到该类型。
int i = 42, *p = &i, &r = i;
decltype(r + 0) b; // r + 0是一个表达式,算术表达式返回右值,因此b是一个int类型
decltype(*p) c = i; // c是一个int &, 解引用运算符*作用于指针类型,得到了p指向的对象的左值(*p = 2很正确),p是指向int的指针,因此decltype(*p)得到的类型是int &。
当变量作为表达式时,返回的是该变量的一个左值形式(因为该表达式的结果可以作为赋值语句的左侧的值)。因此,使用decltype理应得到一个该类型的左值引用。
但是decltype单独作用于对象,没有使用对象的表达式的属性,而是直接获得了变量的类型。
要想获得变量作为表达式的类型,可以加一个括号:
int i = 42;
decltype((i)) ri = i; // 加了括号,变成了表达式, 返回的是i的左值形式 , 因此ri的类型是int &
int i = 42, *p = &i;
decltype((p)) temp = p; //decltype作用的是表达式,(p)得到的是p的左值,所以temp一定是一个引用;p是指向int类型的指针,因此decltype得到的是指向int类型的指针的引用。
decltype + 函数
当使用decltype(函数)
的形式时,decltype会返回对应的函数类型,不会自动转换成相应的函数指针。
C++中通过函数的返回值和形参列表,定义了一种名为函数类型的东西。它的作用主要是为了定义函数指针。
// 声明了一个函数类型
using FuncType = int(int &, int);
// 下面的函数就是上面的类型
int add_to(int &des, int ori);
// 声明了一个FuncType类型的指针
// 并使用函数add_to初始化
FuncType *pf = add_to;
int a = 4;
// 通过函数指针调用add_to
pf(a, 2);
我们可以使用decltype获得函数add_to的类型:
decltype(add_to) *pf = add_to;
这样的声明就简单多了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)