Senior Dogsbody Engineer  

  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;
  这样的声明就简单多了。

 

posted on   高级打杂工程师  阅读(232)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
 
点击右上角即可分享
微信分享提示