c++ - 运算符 '=' 不匹配(std::array<T, 3> 和 std::initializer_list<T>)

标签 c++ arrays c++11 initializer-list

我有一个模板 vec<T>具有恒定长度的数学 vector 的类等于 3。
它看起来像这样:

template <typename T>
class vec{
public:
    vec() { /**/ }

    vec(std::initializer_list<T> list) { /**/ }

private:
    std::array<T, 3> data;
};
我知道,可以初始化 std::arraystd::initializer_list以这样的方式:
std::array<int, 3> a = {1, 2, 3};
所以我想要一个带有 std::initializer_list 的构造函数像这样初始化我的 vector :
vec<int> v = {1, 2, 3};
我也有一个解决方案:只需遍历 std::initializer_list元素并写信给 data :
vec(std::initializer_list<T> list) {
    size_t i = 0;
    for (auto it = list.begin(); it != list.end(); it++) {
        data[i++] = *it;
    }
}
我试图让构造函数看起来像这样(因为 std::array 有一个带有 std::initializer_list 的构造函数):
vec(std::initializer_list<T> list) {
    data = list;
}
但是当我尝试编译程序时,出现错误:
no match for ‘operator=’ (operand types are ‘std::array<int, 3>’ and ‘std::initializer_list<int>)’
这里有什么问题?为什么我不能初始化 std::array以这种方式使用初始化列表?

最佳答案

Why can't I initialize std::array with initializer list in such a way?


支撑初始化列表和 std::initializer_list 不是一回事。 (甚至 std::initializer_list 也可以从支撑初始化列表构造。)std::array是一个聚合,可能是 aggregate-initialized或由支撑初始化列表分配为
std::array<int, 3> a = {1, 2, 3};
a = {4, 5, 6}; // convert {4, 5, 6} to std::array then assign to a
请注意,{1, 2, 3}{4, 5, 6}是大括号初始化列表但不是 std::initializer_list .std::array不能从 std::initializer_list 初始化(或分配) ;它的构造函数和赋值运算符是 implicitly-defined并且没有这样的构造函数或赋值运算符采用 std::initializer_list .
std::initializer_list<int> l = {1, 2, 3};
std::array<int, 3> a = l; // doesn't work
a = l;                    // doesn't work

关于c++ - 运算符 '=' 不匹配(std::array<T, 3> 和 std::initializer_list<T>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64476946/

相关文章:

c++ - 为什么对常量临时值的本地引用似乎比定义它的方法生命周期更长?

c++ - 我可以在 C++ 的模板函数体中使用模板变量吗

ios - 将数组中的项目从最近到最公平排序(从我的位置开始)

c++ - std::array<char, N> 到 std::string

c++ - 使用 qt3d 渲染一个已经加载的网格

c++ - STL 列表插入要求 3 个参数

c++ - 在 C++ 中使用 union 时是否可以跳过字节?

javascript - 如何对对象内数组属性的长度求和

c++ - 两种类型的模板特化

C++ for 模板类的范围循环