vector 不转换大括号括起来的列表

vector does not convert brace encloser list

我用这种类型的构造函数制作了一个 Matrix class:

Matrix<T>(const vector<vector<T>> &m)

如果我这样做,我可以实例化一个 Matrix 对象:

vector<vector<double>> a_v {
        { 17,    24,    1},
        { 23,    5,     7 },
        {  4,     6,    13 }

    };

    Matrix<double> a=a_v;

它工作正常,但我认为 che 构造函数应该充当类型转换器,我认为这段代码也应该工作:

    Matrix<double> a= {
    { 17,    24,    1},
    { 23,    5,     7 },
    {  4,     6,    13 }

};

然而,对于第二个代码,我得到了这个错误:

could not convert ‘{{17, 24, 1}, {23, 5, 7}, {4, 6, 13}}’ from 'brace-enclosed initializer list' to ‘Matrix’

为什么 C++11 不会自动将 brace-enclosed initializer 转换为 vector<vector<double>>

这样初始化矩阵怎么办?

您有两个选择:

  1. 添加一个采用 std::initializer_list<std::initializer_list<T>>
  2. 的构造函数
  3. 用另一组 {} 包围 init 表达式,即

    Matrix<double> a{{
        { 17,    24,    1},
        { 23,    5,     7 },
        {  4,     6,    13 }
    }};
    

好的,我会试着解释一下这里发生的事情:

如果没有采用 std::initializer_list 的构造函数,那么最外层的 {} 总是打开和关闭构造函数调用,而不是您实际传递给构造函数的部分。

Matrix<double> a{ {1, 2}, {3, 4} };
                ^ ^~~~~~~~~~~~~~ ^
                |  2 parameters  |
                |                |
                |                |
            opening            closing

如您所见,这被视为具有 2 个参数的构造函数,在本例中为 2 initializer_lists。

这就是为什么你需要另一套 {}:

Matrix<double> a{ {{1, 2}, {3, 4}} };
                ^ ^~~~~~~~~~~~~~~~ ^
                |  1 parameter     |
                |                  |
                |                  |
            opening            closing

为了让最外面的 {} 被认为是一个 initializer_list,那么构造函数需要有一个重载 initializer_list。这就是 std::vector 案例中发生的情况。