概要
auto用法大全
技术细节
在不知道返回类型是什么的时候可以用auto自动匹配类型
int a = 10; auto b = a; //自动类型推断,auto为int型 cout << typeid(b).name() << endl; //int
auto自动把b推导为int型
不同场景中的auto用法 |
.场景一:
通常我们在遍历容器的时候写法如下:
int main() { vector<string> vs; for (vector<string>::iterator it = vs.begin(); it != vs.end(); it++) { //... } }
这种写法比较繁琐,这时可以用auto代替vector< string>::iterator
int main() { vector<string> vs; for (auto it = vs.begin(); it != vs.end(); it++) { //... } }
也可以通过C11的方式遍历容器或者数组:
int main() { vector<int> vs = {1,2,3,4,5}; for (auto it : vs) { cout << it << endl; } }
.场景二:
auto也会在函数模板中得到应用:
在函数模板中因为传参不知道啥类型,可以用auto来接收
template<typename Tx, typename Ty> void Multiply(Tx x, Ty y) { auto v = x * y; cout << v; } int main() { Multiply(3, 5); }
函数模板根据传入的参数自动推导为int型,故auto也以int型来接收。
auto也可以作为函数模板的返回值:
template<typename Tx, typename Ty> auto Multiply(Tx x, Ty y)->decltype(x * y) { return x * y; } int main() { cout << Multiply(3, 5); }
当函数模板的返回值依赖于函数模板的参数时,我们依旧无法在编译代码前确定模板参数的类型,故也无从知道模板返回值的类型,这时我们可以用auto。
decltype操作符用于查询表达式的数据类型,也是C++11引入的新的运算符,其目的也是解决泛型编程中有些类型由模板参数决定,而难以表示它的问题。
auto在这里的作用也称返回值占位,它只是为函数返回值占了一个位置,真正的返回值是后面的decltype(x * y)。为何要将返回值后置?如果没有后置,则函数声明为:
decltype(x* y) Multiply(Tx x, Ty y)
而此时x, y还没有声明,编译无法通过。
auto使用中需要注意的地方 |
1、auto定义就要初始化
2、把一个引用赋值给auto,auto会自动过滤引用
Int a = 10;
Int& b = a; //b==10
auto c = b; //把一个引用赋给c,但auto会自动过滤引用,此时c类型为int不是int&
auto & d = b; //d的类型为int&
3、auto会自动过滤const和volatile
4、初始化表达式为数组时,auto关键字推导类型为指针
5、auto不能作为模板参数或函数参数
6、auto不是一个真正的类型,仅仅是一个占位符,不能使用一些以类型为操作数的操作符
cout << sizeof(auto) << endl; //错误
cout << typeid(auto).name() << endl; //错误