Синтаксическая ошибка инициализатора std::array c++11

я получаю std::array

no match for ‘operator=’ in ‘myarr = {1, 5, 2, 3, 4}’

ошибка при компиляции этого кода

#include <iostream>
#include <array>

using namespace std;

int main(int argc, char const *argv[])
{
    array<int, 5> myarr;
    myarr = {1,5,2,3,4};

    for(auto i : myarr)
    {
        cout << i << endl;
    }

    return 0;
}

но он компилируется, когда я делаю это в той же строке

array<int, 5> myarr = {1,5,2,3,4};

как присвоить значения в отдельной строке

мне нужно присвоить значения в конструкторе класса, как я могу это сделать?

class myclass
{
  myclass()
  {
    myarr = {1,2,3,4,5}; /// how to assign it   // it gives errors
  }
};

person SRN    schedule 16.02.2012    source источник
comment
Ответы ниже работают, когда вам действительно нужно назначить массив после построения, но на самом деле это редко необходимо. Для конструкторов вы можете и должны использовать список инициализации вместо присваивания, как указано в FAQ по C++ по адресу parashift.com/c++-faq/init-lists.html.   -  person Daniel H    schedule 16.08.2012


Ответы (2)


Вместо одной пары брекетов вам понадобятся две.

myarray = {{1,2,3,4,5}};
person Johannes Schaub - litb    schedule 16.02.2012

Вам нужен временный объект.

class myclass
{
  myclass()
  {
    myarr = std::array<int,5>{1,2,3,4,5};
  }
};

Синтаксис var = { values, ... } допустим только для инициализаторов. Но здесь вы выполняете присваивание, а не инициализацию. Что здесь изменилось в С++ 11, так это то, что теперь вы можете выполнять этот тип инициализации для любого типа класса (где определен соответствующий конструктор), прежде чем он работал только с типами POD и массивами.

person Gunther Piez    schedule 16.02.2012
comment
до этого он работал только с типами POD и массивами Не совсем так; раньше он работал только с типами aggregate. - person ildjarn; 16.02.2012