C++定义类的关键字——decltype

樵夫2021-12-14 11:32

  随着C++模板和泛编程的广泛应用,类型推导已经成为C++必不可少的能力。在decltype出现之前,许多编译器制造商已经实现了自己的C++扩展特性,如GCC的typeof操作符。

C++定义类的关键字——decltype

  C++11仔细考虑了这些类型的推导手段,最终标准化为auto和decltype。decltype类似于auto关键词,用于编译时的类型推导,但与auto不同。

  decltype的类型推导不像auto从变量声明的初始化表达式中获得变量的类型,而是总是以普通表达式作为参数返回表达式类型,decltype不会对表达式进行值。

  decltype推导规则。

  (1)如果e是一个变量或类成员访问表达式,假设e的类型是T,那么decltype(e)是T,decltype(e)是T&。

  如果e是解引用操作,那么decltype(e)和decltype(e)都是T&。

  否则decltype(e)和decltype(e)都是T。

  用法示例

  1)推导出表达式类型。

struct A { double x; };
const A* a = new A{0};

  ///第一种情况。

decltype(a->x) y;       // type of y is double
decltype((a->x)) z = y; // type of z is const double&,因为a一个常量对象指针

  //第二种情况。

int* aa=new int;
decltype(*aa) y=*aa;    //type of y is int&,解引用操作

  //第三种情况。

decltype(5) y;          //type of y is int
decltype((5)) y;        //type of y is int
const int&& RvalRef() { return 1; }
decltype ((RvalRef())) var = 1;  //type of var is const int&&

  2)用using/typedef定义类型。

using size_t = decltype(sizeof(0));//sizeof(a)的返回值为size_t类型
using ptrdiff_t = decltype((int*)0 - (int*)0);
using nullptr_t = decltype(nullptr);

vector<int>vec;
typedef decltype(vec.begin()) vectype;
for (vectype i = vec.begin; i != vec.end(); i++){...}

  显然,像auto一样,代码的可读性也有所提高。

  3)重用匿名类型。在C++中,我们有时会遇到一些匿名类型。

  struct {
    int d ;
    doubel b;
  }anon_s;

  借助decltype,我们可以重用这个匿名结构,C++11之前做不到。

decltype(anon_s) as ;	//定义了一个上面匿名的结构体

  请注意,匿名类型有其匿名的原因。一般来说,匿名类型不应重用,应尽量避免。

  4)泛编程与auto相结合,用于跟踪函数的返回值类型,这是decltype的最大用途。decltype帮助C++模板更加泛化。编写代码时,程序员不需要关心任何时间段的类型选择,编译器会合理推导。

template <typename _Tx, typename _Ty> auto multiply(_Tx x, _Ty y)->decltype(x*y) { return x*y; }

  以上就是小编为大家整理发布的“C++定义类的关键字——decltype”一文,更多相关内容尽在开课吧广场C++教程频道。

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享
全部评论快来秀出你的观点
登录 后可发表观点…
发表
暂无评论,快来抢沙发!
算法刷题核心能力提升营