C++ 中用于类型推断的 auto 关键字

Suraj P 2023年1月30日 2022年4月20日
  1. C++ 中的 auto 关键字
  2. 在 C++ 中将 auto 与函数一起使用
  3. 在 C++ 中对变量使用 auto
  4. 在 C++ 中将 auto 与迭代器一起使用
  5. 在 C++ 中将 auto 与函数参数一起使用
  6. 在 C++ 中使用 auto 关键字的错误
  7. 结论
C++ 中用于类型推断的 auto 关键字

本教程将解决 C++ 11 中引入的 auto 关键字。我们将查看不同的示例以了解其用例和使用时的常见错误。

C++ 中的 auto 关键字

C++ 11 版本中的关键字 autoType inference 功能的一部分。类型推断是指在编译时推断函数或变量的数据类型。

所以我们不必指定数据类型编译器可以在编译时自动推断它。return 语句帮助我们推断函数的返回数据类型。

而在变量的情况下,初始化有助于确定数据类型。

在 C++ 中将 auto 与函数一起使用

#include <iostream>
using namespace std;

auto division()
{
    double a = 55.0;
    double b = 6.0;
    double ans = a/b;
    return ans;
}

int main()
{
  cout<<division();
}

输出:

9.16667

这里的 return 语句帮助编译器推断我们的 division() 函数的返回类型。由于函数返回双精度类型 ans,编译器推断 auto 必须由双精度类型替换。

在 C++ 中对变量使用 auto

#include <iostream>
#include <typeinfo>
using namespace std;

int main()
{
  auto x = 10;
  auto y = 10.4;
  auto z = "iron man";

  cout <<x<<endl;
  cout <<y<<endl;
  cout <<z<<endl;
}

输出:

10
10.4
iron man

基于语句的右侧,也称为 initializers,编译器推断变量的类型。

在 C++ 中将 auto 与迭代器一起使用

在处理向量、集合或映射等 STL 容器时,auto 关键字被高度用于迭代它们。我们可以通过跳过冗长的迭代器声明来最小化时间损失。

#include <bits/stdc++.h>
using namespace std;

int main()
{
 vector<int> v{22,14,15,16};

 vector<int>::iterator it = v.begin();  //without auto
 auto it2 = v.begin();

 while(it2!=v.end())
 {
    cout<<*it2<<" ";
    it2++;
 }
 cout<<endl;

 map<int,int> mp;
 mp.insert(pair<int, int>(1, 40));
   mp.insert(pair<int, int>(2, 30));
   mp.insert(pair<int, int>(3, 60));
   mp.insert(pair<int, int>(4, 20));

map<int,int>::iterator vt = mp.begin(); //without auto
auto vt2 = mp.begin();

 while(vt2!=mp.end())
 {
    cout<<vt2->first<<" -> "<<vt2->second<<endl;
    vt2++;
 }
 cout<<endl;
}

输出:

22 14 15 16
1 -> 40
2 -> 30
3 -> 60
4 -> 20

我们观察使用 auto 和不使用之间的区别。如果没有 auto,我们必须明确指定迭代器的类型,这很乏味,因为语句很长。

在 C++ 中将 auto 与函数参数一起使用

在 C++ 中,我们必须每次都指定函数参数,但这可以通过使用 auto 来简化。

#include <bits/stdc++.h>
using namespace std;

void myfunc(auto x, auto str)
{
    cout<<x<<" "<<str<<endl;
}

int main()
{
    int x = 10;
    string str = "Iron Man";
    myfunc(x, str);
}

输出:

10 Iron Man

数据类型的推断发生在函数调用期间。因此,会发生变量匹配,并且编译器会计算出所有参数的确切数据类型。

在 C++ 中使用 auto 关键字的错误

整数与布尔混淆

在 C++ 中,我们知道布尔值被初始化为 01。现在,这可能会在调试时造成一些混乱。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    auto temp = 0;
}

使用 auto 关键字的多个声明

我们一次性声明变量以节省时间,但如果两者的类型不同,这可能会产生问题。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    auto x = 10, y = 35.66;
}

输出:

[Error] inconsistent deduction for 'auto': 'int' and then 'double'

当我们在编译器中编译上面的代码时,我们会得到一个错误,这是因为编译器被混淆了。

结论

我们了解到,auto 关键字节省了大量编写基本代码的时间,专注于程序中更密集和更复杂的部分。虽然非常有用,但我们必须小心使用它。

Author: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub