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; // 錯誤


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM