矢量不转换括号括号列表

And*_*993 2 c++11 list-initialization

Matrix用这种类型的构造函数创建了一个类:

Matrix<T>(const vector<vector<T>> &m)
Run Code Online (Sandbox Code Playgroud)

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

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

    };

    Matrix<double> a=a_v;
Run Code Online (Sandbox Code Playgroud)

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

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

};
Run Code Online (Sandbox Code Playgroud)

但是使用第二个代码我收到此错误:

无法将"{{17,24,1},{23,5,7},{4,6,13}}"从"大括号括号初始化列表"转换为"矩阵"

为什么C++11不转换brace-enclosed initializervector<vector<double>>自动?

如果我想以这种方式初始化矩阵,我该怎么办?

bol*_*lov 7

您有两种选择:

  1. 添加一个构造函数 std::initializer_list<std::initializer_list<T>>
  2. eclose init表达式与另一组{}ie

    Matrix<double> a{{
        { 17,    24,    1},
        { 23,    5,     7 },
        {  4,     6,    13 }
    }};
    
    Run Code Online (Sandbox Code Playgroud)

好的,我会试着解释一下这里发生了什么:

如果没有构造函数接受a std::initializer_list那么最外面的{}那些总是打开和关闭构造函数调用,如果你愿意,而不是你实际传递给构造函数的部分.

Matrix<double> a{ {1, 2}, {3, 4} };
                ^ ^~~~~~~~~~~~~~ ^
                |  2 parameters  |
                |                |
                |                |
            opening            closing
Run Code Online (Sandbox Code Playgroud)

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

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

Matrix<double> a{ {{1, 2}, {3, 4}} };
                ^ ^~~~~~~~~~~~~~~~ ^
                |  1 parameter     |
                |                  |
                |                  |
            opening            closing
Run Code Online (Sandbox Code Playgroud)

为了使最外层{}被认为是initializer_list,那么构造函数需要重载一个initializer_list.这就是std::vector案件中发生的事情.