本文是对 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 作用表达式。
- auto 类型说明符用编译器计算变量的初始值来推断其类型(用 auto 申明的变量必须初始化),而 decltype 尽管也让编译器剖析表达式并失去它的类型,然而不理论计算表达式的值。
- 编译器推断进去的 auto 类型有时候和初始值的类型并不齐全一样,编译器会适当地扭转后果类型使其更合乎初始化规定。例如,auto 个别会疏忽顶层 const,而把底层 const 保留下来。与之相同,decltype 会保留变量的顶层 const。
- decltype 在解决顶层 const 和援用的形式与 auto 有些许不同,如果 decltype 应用的表达式是一个变量,则 decltype 返回该变量的类型(包含顶层 const 和援用在内)。
如果表达式的内容是解援用操作,则 decltype 将失去援用类型。正如咱们所相熟的那样,解援用指针能够失去指针所指对象,而且还能够给这个对象赋值。因而 decltype(*p)的后果类型就是 int&.
参考
- C++11 新个性— auto 和 decltype 区别和分割
- C++ auto 和 decltype 的区别
- C++ 中关键字 auto 和 decltype 的区别
- C++11:decltype 类型推导