c++11 - vector 不转换大括号括起来的列表

标签 c++11 list-initialization

我做了一个 Matrix具有此类构造函数的类:

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 initializervector<vector<double>>自动?

这样初始化矩阵应该怎么办?

最佳答案

你有两个选择:

  1. 添加一个采用std::initializer_list<std::initializer_list<T>>的构造函数
  2. 用另一组 {} 封闭 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 中发生的事情。案例。

关于c++11 - vector 不转换大括号括起来的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45939190/

相关文章:

c++ - 等待 atomic_bool

c++11 - 为什么隐式转换发生在 "if expression"虽然它应该是显式转换

c++ - Braced-init-lists 和函数模板类型推导顺序

c++ - 错误到底是什么以及错误地为可 move 和不可复制成员调用复制构造函数有什么解决方法

c++ - 如何优雅地就地修改容器中的所有元素?

c++ - C++ 11统一初始化(即列表初始化)不与继承一起编译

c++ - 具有函数指针的映射列表初始化的类

c++ - 如何初始化字符串的std::array?

c++ - 在使用 unique_ptr 的函数调用中使用大括号初始化的自动类型推导失败

c++ - 如何使用 cv 和引用限定符从 std::function 获取参数和返回类型?