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 initializer到vector<vector<double>>自动?
如果我想以这种方式初始化矩阵,我该怎么办?
您有两种选择:
std::initializer_list<std::initializer_list<T>>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案件中发生的事情.
| 归档时间: |
|
| 查看次数: |
392 次 |
| 最近记录: |