auto关键字

c++11使用auto来做自动类型推导,编译器会在编译期间自动推导出变量的类型。

[[toc]]

基本使用语法:

1
auto name = value;

name: 变量的名字

value: 变量的初始值

auto仅仅是一个占位符,在编译期间它会被真正的类型所替代,或者说,c++中的变量必须是有明确类型的。

例:

1
2
3
4
auto n = 10;
auto f = 3.14;
auto p = &n;
auto str = "hello world";

第1行中,10是一个整数,默认为int类型,auto推导出为int

第2行中,3.14为一个浮点数,默认为doubleauto也为double

第3行中,&n的结果是一个int*类型的指针,所以autoint* .

第4行中,str为一个字符串为const char*类型,所以autoconst char*,也即一个常量指针。

auto的限制

  1. 使用auto时必须对变量进行初始化

  2. auto不能在函数的参数中使用

我们在定义函数时只是对函数进行了声明,指明了函数的类型,但是并没有对它进行初始化赋值,只有在实际使用时才会给参数赋值, 而auto要求必须对变量进行初始化。

  1. auto不能作用于类的非静态成员变量(也就是没有static关键字修饰的成员变量)中

  2. auto关键字不能定义数组

1
2
char word[] = "hello world";
auto str[] = word; // word为数组,所以不能使用auto
  1. auto不能作用于模版参数
1
2
3
4
5
6
7
8
9
10
template<typename T>
class A {
// TODO:
};

int main() {
A<int> C1();
A<auto> C2 = C1; // error
return 0;
}

auto的应用

使用auto定义迭代器

我们的常规写法遍历容器中的元素:

1
2
3
4
5
6
7
8
9
##include <iostream>
#include <vector>
using namespace std;

int main() {
vector<vector<int> > v;
vector<vector<int> >::iterator i = v.begin();
return 0;
}

可以看出写起来非常麻烦,并且容易出错,我们可以通过auto类型推导:

1
2
3
4
5
6
7
8
9
#include <iostream>
#include <vector>
using namespace std;

int main() {
vector<vector<int> > v;
auto i = v.begin();
return 0;
}

auto可用于范型编程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>

class A {
public:
static int get() {
return 100;
}
};

class B {
public:
static const char* get() {
return "hello world";
}
};

template <typename T>
void func() {
auto val = T::get();
std::cout << val << std::endl;
}

int main() {
func<A>();
func<B>();
return 0;
}

运行结果为:

100
hello world