C++ 中的auto、auto&、auto&&、const auto&

/*
 * @Description: 
 * @Author: CM
 * @Date: 2021-04-23 14:23:56
 * @LastEditTime: 2021-04-23 14:40:13
 * @LastEditors: CM
 */

#include <iostream>
#include <vector>

using namespace std;
class A
{
          
   
public:
    /* 构造函数 */
    A()
    {
          
   
        for (int i = 0; i < 5; i++)
        {
          
   
            intVec.push_back(i);
        }
    }

    /* 用迭代器输出容器中的值 */
    void printVec() {
          
   
        for (vector<int>::iterator it = intVec.begin(); it != intVec.end(); it++){
          
   
            cout << (*it) << " ";
        }
        cout << endl;  
    }

    /* auto :拷贝一份容器中元素,而不会改变原容器的值
        auto的自动类型推断发生在编译期,所以使用auto并不会造成程序运行时效率的降低。*/
    void test1()
    {
          
   
        for (auto i : intVec)
        {
          
   
            i += 1;
        }        
    }

    /* auto & :修改了原容器中元素的值 */
    /* &代表引用,for (int& i : intVec) */
    void test2()
    {
          
   
        for (auto& i : intVec)
        {
          
   
            i += 1;
        }
        
    }

    /* auto && :也可以修改元素的值(一般用这种方法) */
    void test3()
    {
          
   
        for (auto&& i : intVec)
        {
          
   
            i += 1;
        }
    }
    
    /* const auto & :只读 */
    /* for (const int & i : intVec) :只读 */
    void test4()
    {
          
   
        for (const auto& i : intVec)
        {
          
   
            /* 报错:表达式必须是可修改的左值 */
            // i += 1; 
        }
       
    }

private:
    vector<int> intVec;  
};

int main()
{
          
   
    A a;
    
    a.printVec();   //0 1 2 3 4
    a.test1();      //auto
    a.printVec();   //0 1 2 3 4

    a.printVec();   //0 1 2 3 4
    a.test2();      //auto&
    a.printVec();   //1 2 3 4 5

    a.printVec();   //1 2 3 4 5
    a.test3();      //auto&&
    a.printVec();   //2 3 4 5 6
    
}

参考链接

. . . . .

经验分享 程序员 微信小程序 职场和发展