Информация об изменениях

Сообщение Re: C++11 error: use of deleted function от 07.04.2016 11:39

Изменено 08.04.2016 1:42 watchmaker

Здравствуйте, Elija, Вы писали:

E>3) Как я понимаю, инициализация списком использует или direct-list-initialization или copy-list-initialization.


E>8.5.4 List-initialization

Это не то. Инициализация массивов описана в dcl.init.aggr. В принципе там описано, что если элементы массива не агрегаты, то для них будет выполняться copy-initialized from the corresponding initializer-clause. То есть компилятор может сначала сконструировать элементы типа B, а потом их скопировать в arrB, что без конструктора копирования или конструктора перемещения сделать нельзя. Конструктор копирования у тебя удалён, а вот добавление перемещающего спасает дело.

Ну и как уже заметили, автогенерация конструкторов и copy ellision просто всё запутывают.

Короче, избавься от агрегата:
  //B arrB[3];
  std::array<B, 3> arrB;

A(int p1, int p2)
    : arrB{{ {p1+1, p2+2}, {p1+3, p2+4}, {p1+5, p2+6} }}
  { }
Re: C++11 error: use of deleted function
Здравствуйте, Elija, Вы писали:

E>3) Как я понимаю, инициализация списком использует или direct-list-initialization или copy-list-initialization.


E>8.5.4 List-initialization

Это не то. Инициализация массивов описана в dcl.init.aggr. В принципе там описано, что если элементы массива не агрегаты, то для них будет выполняться copy-initialized from the corresponding initializer-clause. То есть компилятор может сначала сконструировать элементы типа B, а потом их скопировать в arrB (на самом деле не может
Автор: watchmaker
Дата: 08.04.16
), что без конструктора копирования или конструктора перемещения сделать нельзя. Конструктор копирования у тебя удалён, а вот добавление перемещающего спасает дело.

Ну и как уже заметили, автогенерация конструкторов и copy ellision просто всё запутывают.

Обойти можно избавившись от агрегата:
  //B arrB[3];
  std::array<B, 3> arrB;

A(int p1, int p2)
    : arrB{{ {p1+1, p2+2}, {p1+3, p2+4}, {p1+5, p2+6} }}
  { }