《C++避坑神器·十》auto用法看这篇就够

简介: 《C++避坑神器·十》auto用法看这篇就够

概要

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; //错误

相关文章
|
28天前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
2月前
|
安全 程序员 编译器
C++ 11新特性之auto和decltype
C++ 11新特性之auto和decltype
34 3
|
28天前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
3月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
|
3月前
|
存储 安全 编译器
C++入门 | auto关键字、范围for、指针空值nullptr
C++入门 | auto关键字、范围for、指针空值nullptr
62 4
|
3月前
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
43 0
|
4月前
|
C++
C++ string中的函数和常用用法
C++ 中string中的函数和常用用法
35 4
|
3月前
|
存储 编译器 C++
【C++关键字】auto的使用(C++11)
【C++关键字】auto的使用(C++11)
|
4月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
5月前
|
存储 安全 编译器
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
64 5