decltype被称为类型说明符,它的作用是选择并返回操作数的数据类型

  1. // sum的类型就是函数f返回的类型
  2. decltype(f()) sum = x

工作原理

decltype并不会实际计算表达式的值,编译器分析表达式并得到它的类型
函数调用也算一种表达式,因此不必蛋心在使用decltype是执行了函数。

decltype+变量

  1. const int ci = 0, &cj = ci;
  2. // x的类型是const int
  3. decltype(ci) x = 0;
  4. // y的类型是const int &
  5. decltype(cj) y = x;

decltype完美保留变量的类型
decltype加数组返回值数组的类型
decltype加指针返回指针的类型。

decltype+表达式

  1. int i = 42, *p = &i, &r = i;
  2. // r + 0是一个表达式
  3. // 算术表达式返回右值
  4. // b是一个int类型
  5. decltype(r + 0) b;
  6. // c是一个int &
  7. decltype(*p) c = i;

decltype+函数

  1. // 声明了一个函数类型
  2. using FuncType = int(int &, int);
  3. // 下面的函数就是上面的类型
  4. int add_to(int &des, int ori);
  5. // 声明了一个FuncType类型的指针
  6. // 并使用函数add_to初始化
  7. FuncType *pf = add_to;
  8. int a = 4;
  9. // 通过函数指针调用add_to
  10. pf(a, 2);
  11. //使用decltype获得函数add_to的类型
  12. decltype(add_to) *pf = add_to;