【问题标题】:why am i getting a "no instance of constructor matches the MyArray::MyArray" argument list?为什么我得到一个“没有构造函数实例匹配 MyArray::MyArray”参数列表?
【发布时间】:2019-12-25 22:59:00
【问题描述】:
#include <iostream>
#include <initializer_list>

class MyArray {
    int* array;
public:
    MyArray(){}
    MyArray(std::initializer_list<int>& v) {
        array = new int[v.size()];
        int index = 0;
        for (auto element : v) {
            array[index] = element;
            index++;
        }
    }

    ~MyArray()
    {
        delete[] array;
    }
};

int main() {
    MyArray object{ 2,4,2,2 };
}

这是我第一次使用 std::initializer 进行对象列表初始化。我创建了一个使用 MyArray 构造函数初始化的数组。我不知道我哪里错了。我创建了一个与参数列表匹配的对象,即一个接受初始化列表的构造函数。

【问题讨论】:

    标签: c++


    【解决方案1】:

    我创建了一个与参数列表匹配的对象,即一个接受初始化列表的构造函数。

    你没有;不完全。

    您创建了一个构造函数,该构造函数将 reference 指向 std::initializer_list

    但是以这种方式创建的 [可能] 是一个无法绑定到此类引用的临时对象。

    通常您只想按价值获取std::initializer_lists。即:删除&amp;

    cppreference's article on std::initializer_list上有一些例子。

    【讨论】:

    • cppreference上的内容看不懂,开始学c++后智商下降。感谢您指出显而易见的事情。
    • 没关系,你的智商是安全的:只是混淆程度会随着与这种可怕的语言有关的任何事情上升:P
    • 你也可以使用const引用来延长临时对象的寿命吗?
    • @ChrisMM 我猜是这样,但这并没有真正让你获得任何价值,也不是惯用的(可能是因为它并没有真正让你获得任何东西)。阅读why is std::initializer_list often passed by value?
    【解决方案2】:

    MyArray object{ 2,4,2,2 };

    其实这是调用 MyArray 的移动赋值。 { 2,4,2,2 } 是右值,不能将其绑定到引用。

    你需要了解什么是右值引用和移动语义,这里有一个很好的答案: What is move semantics?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 2021-07-02
      • 2016-03-05
      • 2013-10-29
      • 2014-05-16
      • 1970-01-01
      • 2014-09-09
      相关资源
      最近更新 更多