本文是对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类型推导