在 C++11 当中 auto
关键字用于根据一个值或者表达式让编译器自动推导所定义变量的类型。
本章从 auto
关键字的作用、推导规则以及使用 auto
关键字的常见场景三个部分来介绍 auto
关键字。
作用
auto
关键字主要用于在编译时期让编译器根据一个常量或者另一个变量自动推导所定义变量的类型。实际上,auto关键字还可以用在函数的返回值推导上面。
下面是 auto
的一些基本用法:
auto x = 6; // x是int类型
auto pi = new auto(1); // pi是int*
const auto *v = &x, u = 6; // v是const int*,u是const int类型
static auto y = 0.0; // y的类型是double
auto
的推导规则
auto
不仅可以和指针、引用结合起来使用,还可以带上 cv 限定符(cv-qualifier
,const
和 volatile
限定符)。
再来看一些例子:
int x = 0;
// 注释当中写的是auto推导出的类型
auto *a = &x; // int类型
auto b = &x; // int*
auto &c = x; // int
auto d = c; // int
const auto e = x; // int
auto f = e; // int
auto
关键字的推导规则如下:
- 当声明变量不带指针或者引用时,auto的推导结果与初始化表达式抛弃引用和
cv
限定符后类型一致;例如说,const int x = 0; auto y = x;
。这里y
的类型是int
类型,而不是const int
。 - 当声明变量带指针或者引用时,
auto
的推导结果将保持初始化表达式的cv
属性。
不能使用 auto
自动推导的情况
- 函数的参数
- 结构体内部的非静态成员变量;
- 定义数组
void func(auto a = 1) {} // 不能用于函数参数
struct Foo
{
auto var1 = 0; // 错误:不能用于非静态成员变量
static const auto var2 = 0; // var2的类型是static const int
};
使用 auto
的一些常见场景
- 变量的类型声明。
auto x = 1.0; // x -> double
auto
和decltype
结合使用构成尾置返回值类型
template<typename T1, typename T2>
auto add(const T1& a, const T2& b) -> decltype(a + b)
{
return a + b;
}
这样我们就能够让编译器根据函数的参数推导出函数返回值的类型,而不必再增加一个额外的模板参数。
- 简化容器迭代器的声明
std::vector<int> vec = {1, 2, 3, 4};
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << std::endl;
}
- 范围
for
循环
for (auto x : vec)
{
std::cout << x << std::endl;
}
lambda
表达式
auto add = [](int a, int b) { return a + b; }; // 自动推导 lambda 的返回类型
int result = add(10, 20);
std::cout << "Result: " << result << std::endl;