auto 除了可以独立使用,还可以和某些具体类型混合使用,这样 auto 表示的就是“半个”类型,而不是完整的类型。请看下面的代码:
1 | int x = 0; |
下面我们来解释一下:
- 第 2 行代码中,p1 为 int* 类型,也即 auto * 为 int *,所以 auto 被推导成了 int 类型。
- 第 3 行代码中,auto 被推导为 int* 类型,前边的例子也已经演示过了。
- 第 4 行代码中,r1 为 int & 类型,auto 被推导为 int 类型。
- 第 5 行代码是需要重点说明的,r1 本来是 int& 类型,但是 auto 却被推导为 int 类型,这表明当
=
右边的表达式是一个引用类型时,auto 会把引用抛弃,直接推导出它的原始类型。
接下来,我们再来看一下 auto 和 const 的结合:
1 | int x = 0; |
下面我们来解释一下:
- 第 2 行代码中,n 为 const int,auto 被推导为 int。
- 第 3 行代码中,n 为 const int 类型,但是 auto 却被推导为 int 类型,这说明当
=
右边的表达式带有 const 属性时, auto 不会使用 const 属性,而是直接推导出 non-const 类型。 - 第 4 行代码中,auto 被推导为 int 类型,这个很容易理解,不再赘述。
- 第 5 行代码中,r1 是 const int & 类型,auto 也被推导为 const int 类型,这说明当 const 和引用结合时,auto 的推导将保留表达式的 const 类型。
最后我们来简单总结一下 auto 与 const 结合的用法:
- 当类型不为引用时,auto 的推导结果将不保留表达式的 const 属性;
- 当类型为引用时,auto 的推导结果将保留表达式的 const 属性。