C++ auto 的使用

在C++ 98 中,auto 的作用是让变量成为自动变量(拥有自动的生命周期),但是该作用是多余的,变量默认拥有自动的生命周期,在C++ 11 中,已经删除了该用法,取而代之的作用是:自动推断变量的类型。

0.代替冗长复杂,变量使用范围专一的变量声明

std::vector<std::string> vec;

for (auto iter = vec.begin(); iter != vec.end(); ++iter) {}

1.需要改变迭代对象 for(auto &i:s)

string s = "fuck";
for (auto &i : s ) 
    i = toupper(i); //改变成大写,影响s的值
cout<<s<<endl; //s的值是 FUCK

2.不需要改变迭代对象 for(auto i:s)

string s = "shit";
for (auto i : s )
    i = toupper(i); //改变成大写,不影响s的值
cout<<s<<endl; //s的值是 shit

3.迭代map

#include <iostream>
#include <map>

using namespace std;

int main() {
    map<int,string> student;
    student.insert(pair<int,string>(2,"li"));
    student.insert(pair<int,string>(1,"wang"));
    student.insert(pair<int,string>(3,"sun"));
    for(auto &v : student) // for(auto v : student)也是可以的
        cout<<"key: "<<v.first<<" | value: "<<v.second<<endl;
    return 0;
}

4.迭代vector

int main(){
    vector<int>v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    for(auto i : v){
        cout<<i<<" ";
    }
    cout<<endl;
    return 0;
}

5.在定义函数模板时,用于声明依赖模板参数的变量类型,模板函数依赖于模板参数的返回值

template<typename Tx, typename Ty>

  auto multiply(Tx x, Ty y)

  {

    return x * y;

  }

 

注意事项:

(1)auto 变量必须在定义时进行初始化操作(这很好理解,如果不进行初始化操作,那么 auto 关键字就不能进行变量类型的推导了)

(2)定义一个 auto 序列的变量时,必须是同一种类型,如:

  auto a = 1, b = 2, c = 3; // 正确

  auto a = 1, b = 2.2, c = 'c'; // 错误(这个道理和第一点注意事项相同)

(3)如果表达式是引用,则去除引用语义

  int32_t a = 1;

  int32_t& b = a;

  auto c = b; // 此时c的类型被推导为 int32_t,而不是int32_t&

  auto& c = b; // 此时c的类型才是int32_t&(自我理解,定义一个引用,那么就直接操作的是b,而b的类型是int32_t&,所以这里的类型是int32_t&)

(4)如果表达式是const或volatile(或两者都有),则去除const/volatile语义

(5)如果auto关键字带上&号,则不去除const语义

(6)如果表达式为数组,auto关键字推导类型为指针,如:

  int32_t a[3] = {};

  auto arr = a;

  std::cout << typeid(arr).name() << std::end; // 这里输出 int *

(7)如果表达式为数组,且auto带上&,则推导出的类型为数组类型,如:

  int32_t a[3] = {};

  auto& arr = a;

  std::cout <<typeid(arr).name() std::endl; // 这里输出int [3]

(8)函数或模板参数不能被声明为auto

(9)auto不是一个真正的类型,仅仅是一个占位符,不能使用一些以类型为操作数的操作符,如sizeof或typeid

  std::cout << sizeof(auto) std::endl; // 错误

  std::cout << typeid(auto).name() std::endl; // 错误

原文链接: https://www.cnblogs.com/xxxsans/p/12712769.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++ auto 的使用

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/342290

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午1:31
下一篇 2023年3月2日 上午1:32

相关推荐