'auto' C++ 中的声明问题

'auto' declaration issue in C++

我在使用 auto 声明时遇到问题。我在Visual Studio 2017年写了一个程序如下:

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <vector>

using namespace std;

class MyClass
{
public:
    struct mystruct {
        vector<int> vi;
    };
    vector<mystruct> TheStructV;
    void AddStructV() {
        TheStructV.push_back(mystruct());
    };
};

int main()
{
    MyClass MyObj[3];
    for (int a = 0; a < 3; a++) {
        MyObj[a].AddStructV();
        for (int i = 1; i <= 5; i++) {
            MyObj[a].TheStructV[MyObj[a].TheStructV.size() - 1].vi.push_back(i * 10 + idx);
        }
        idx++;
    }
    for (int b = 0; b<3; b++) {
        cout << "MyObj[" << b  << "] struct vector size:" << MyObj[b].TheStructV.size() << endl;
        cout << "MyObj[" << b  << "] struct vi size:" << MyObj[b].TheStructV[0].vi.size() << endl;
    }
    for (int i = 0; i < 3; i++) {
        cout << "MyObj[" << i  << "].vi:";
        for (int j = 0; j < 5; j++) {
            cout << MyObj[i].TheStructV[0].vi[j] << "-";
        }
        cout << endl;
    }
    return 0;
}

按预期工作,输出为:

MyObj[0] struct vector size:1
MyObj[0] struct vi size:5
MyObj[1] struct vector size:1
MyObj[1] struct vi size:5
MyObj[2] struct vector size:1
MyObj[2] struct vi size:5
MyObj[0].vi:11-21-31-41-51-
MyObj[1].vi:12-22-32-42-52-
MyObj[2].vi:13-23-33-43-53-

但是,如果我将代码更改为:

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <vector>

using namespace std;

class MyClass
{
public:
    struct mystruct {
        vector<int> vi;
    };
    vector<mystruct> TheStructV;
    void AddStructV() {
        TheStructV.push_back(mystruct());
    };
};

int main()
{
    MyClass MyObj[3];

    int idx = 1;
    for (auto M : MyObj) {
        M.AddStructV();
        for (int i = 1; i <= 5; i++) {
            M.TheStructV[M.TheStructV.size() - 1].vi.push_back(i * 10 + idx);
        }
        idx++;
    }
    for (int b = 0; b<3; b++) {
        cout << "MyObj[" << b << "] struct vector size:" << MyObj[b].TheStructV.size() << endl;
        cout << "MyObj[" << b << "] struct vi size:" << MyObj[b].TheStructV[0].vi.size() << endl;
    }
    idx = 1;
    for (auto MC : MyObj) {
        cout << "MyObj[" << idx - 1 << "].vi:";
        for (auto thisStruct : MC.TheStructV) {
            cout << thisStruct.vi[0] << "-";
            cout << thisStruct.vi[1] << "-";
            cout << thisStruct.vi[2] << "-";
            cout << thisStruct.vi[3] << "-";
            cout << thisStruct.vi[4] << "-";
        }
        cout << endl;
        idx++;
    }

    return 0;
}

它编译没有问题,但是当我 运行 它时出现错误,输出是:

MyObj[0] struct vector size:0

程序卡在这里

我好像漏掉了什么。我什至尝试用 MyClass M 替换 auto M,但仍然是同样的问题。

此行将复制您的对象

for (auto M : MyObj)

将其更改为参考,以便您可以修改它

for (auto& M : MyObj)