Сообщение 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 просто всё запутывают.
Короче, избавься от агрегата:
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 (на самом деле не может
Ну и как уже заметили, автогенерация конструкторов и copy ellision просто всё запутывают.
Обойти можно избавившись от агрегата:
E>3) Как я понимаю, инициализация списком использует или direct-list-initialization или copy-list-initialization.
E>8.5.4 List-initialization
Это не то. Инициализация массивов описана в dcl.init.aggr. В принципе там описано, что если элементы массива не агрегаты, то для них будет выполняться copy-initialized from the corresponding initializer-clause.
Автор: watchmaker
Дата: 08.04.16
), что без конструктора копирования или конструктора перемещения сделать нельзя. Конструктор копирования у тебя удалён, а вот добавление перемещающего спасает дело.Дата: 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} }}
{ }