Разрешено ли присваивание std :: array из фигурного списка значений в c ++? - PullRequest
0 голосов
/ 17 февраля 2019

В праймере c ++ (5-е издание) упоминается, что назначение std :: array из фигурного списка значений недопустимо.

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

Ниже приведен пример кода.

  std::array<int, 10> a1 = {0,1,2,3,4,5,6,7,8,9}; 
  std::array<int, 10> a2 = {0}; // elements all have value 0
  a1 = a2; // replaces elements in a1
  a2 = {0}; // error: cannot assign to an array from a braced list

Однако, когда я компилирую этот код с компилятором c ++ 11, он работает нормально.Это разрешено сейчас или я что-то упустил?

1 Ответ

0 голосов
/ 17 февраля 2019

Да, std::array можно назначить из списка в скобках.Он просто работает нормально по правилам C ++ 11 - класс не должен делать ничего особенного для его поддержки. Рассмотрим :

struct S {int x; int y;};
int main() {
  S s{1, 2};
  s = {3, 4};
}

Будучи агрегатом, S можно построить из списка фигурных скобок.Кроме того, S имеет неявно объявленный оператор присваивания, принимающий const S&.Соединяя их вместе, компилятор интерпретирует s = {3, 4} как s.operator=(S{3, 4})

То же самое происходит с std::array.

...