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

相关文章
|
27天前
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
94 0
|
2月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
37 3
【C++】map、set基本用法
|
27天前
|
C++
第十三问:C++中静态变量的用法有哪些?
本文介绍了 C++ 中静态变量和函数的用法及原理。静态变量包括函数内的静态局部变量和类中的静态成员变量,前者在函数调用间保持值,后者属于类而非对象。静态函数不能访问非静态成员,但可以通过类名直接调用。静态链接使变量或函数仅在定义文件内可见,避免命名冲突。
56 0
|
3月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
4月前
|
安全 程序员 编译器
C++ 11新特性之auto和decltype
C++ 11新特性之auto和decltype
52 3
|
3月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
5月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
|
5月前
|
存储 安全 编译器
C++入门 | auto关键字、范围for、指针空值nullptr
C++入门 | auto关键字、范围for、指针空值nullptr
87 4
|
6月前
|
C++
C++ string中的函数和常用用法
C++ 中string中的函数和常用用法
66 4
|
5月前
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
59 0