为什么调用构造函数后 initializer_list 中的 vector<int> 的值会发生变化?

Why are the values of vector<int> inside initializer_list changing after calling the constructor?

我是 C++ 新手,正在尝试设置矩阵 class。该矩阵是根据包含 vector<int> 个条目作为矩阵行的 initializer_list 创建的。 这个class的方法之一应该是get_row(size_t rownumber)。当我从构造函数调用实现的方法时,它 returns 是正确的结果。但是当从 main() 调用相同的方法时,每行的前两个元素包含一些不应该在其中的巨大数字。

我认为这个问题与指针有某种关系。虽然,我真的找不到在构造函数内部调用和 main 内部调用之间可以覆盖矩阵元素的位置。当我在 Eclipse 中进入调试模式时,指针似乎指向预期的地址...

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

template<typename T> class myMatrix {
    private:
        initializer_list<vector<int>>::iterator it;
        initializer_list<vector<int>> matrix;
    public:
        myMatrix(initializer_list<T> values) {
        matrix = values;

        vector<int> chosen_row = get_row(1);
        cout << "Called from constructor: ";
        for (unsigned i = 0; i != chosen_row.size(); i++) {
            cout << chosen_row.at(i) << " ";
        }
        }
    vector<int> get_row(size_t x) {
        it = matrix.begin() + x - 1;
        return (*it);
        }
};

int main(int argc, char *argv[]) {
    myMatrix<vector<int>> test{{3, 4, 5, 2}, {7, 2, 3, 4}};
    vector<int> chosen_row = test.get_row(1);
    cout << endl << "Called from main: ";
    for (unsigned i = 0; i != chosen_row.size(); i++) {
        cout << chosen_row.at(i)<< " " ;
    }
    return 0;
}

输出如下:

Called from constructor: 3 4 5 2 
Called from main: 187072144 22084 5 2

谁能告诉我错误发生在哪里?非常感谢!

initializer_listconst 数组的轻量级视图,它不拥有(或延长其生命周期)任何元素。

当您编写 {{3, 4, 5, 2}, {7, 2, 3, 4}} 时,您是在堆栈上创建一个临时向量数组 - initializer_list 基本上是其中的指针+长度视图。构建矩阵后,该数组将被销毁。

matrix 实现中使用 vector 之类的容器而不是 initializer_list 来解决问题。例如

private:
    vector<vector<int>>::iterator it;
    vector<vector<int>> matrix;