乐趣区

关于c++11:简述C11中auto和deltype

本文是对 auto 和 decltype 的简述,更加具体的内容看文章后参考局部。

一. auto 和 deltype 作用

C++11 规范引入了 auto 和 decltype 类型说明符,它能让编译器帮咱们去剖析表达式所属的类型。

auto 的推导能力较弱,而且还有限度。

例如: auto 不能推导数组类型:

  int arr[5] = {1};
  // auto 不能用于推到数组类型。因为 {arr} 纯正是一个句法结构。它不是一个表达式,也没有类型。因而,auto 不能从中推断出它的类型。auto auto_arr2[10] = {arr};  // !!!! error:‘auto_arr2’declared as array of‘auto’

而 decltype 能够:

  int arr[5] = {1};
  decltype(arr) auto_arr1[5] = {1};

除此之外还有其余中央,咱们接着往下看。总之,decltype 的呈现是为了解决 auto 存在的一些问题,能用 auto 肯定能够用 decltype。然而 auto 相比 decltype 又更加简洁,所以能用 auto 就应用 auto,不行就用 decltype。

二. decltype 和 auto 区别

简略的了解能够说,auto 作用变量,decltype 作用表达式。

  1. auto 类型说明符用编译器计算变量的初始值来推断其类型(用 auto 申明的变量必须初始化),而 decltype 尽管也让编译器剖析表达式并失去它的类型,然而不理论计算表达式的值。
  2. 编译器推断进去的 auto 类型有时候和初始值的类型并不齐全一样,编译器会适当地扭转后果类型使其更合乎初始化规定。例如,auto 个别会疏忽顶层 const,而把底层 const 保留下来。与之相同,decltype 会保留变量的顶层 const。
  3. decltype 在解决顶层 const 和援用的形式与 auto 有些许不同,如果 decltype 应用的表达式是一个变量,则 decltype 返回该变量的类型(包含顶层 const 和援用在内)。

如果表达式的内容是解援用操作,则 decltype 将失去援用类型。正如咱们所相熟的那样,解援用指针能够失去指针所指对象,而且还能够给这个对象赋值。因而 decltype(*p)的后果类型就是 int&.

参考

  1. C++11 新个性— auto 和 decltype 区别和分割
  2. C++ auto 和 decltype 的区别
  3. C++ 中关键字 auto 和 decltype 的区别
  4. C++11:decltype 类型推导
退出移动版