Re[2]: initializer_list - убийца move семантики
От: rg45 СССР  
Дата: 23.10.18 09:10
Оценка:
Здравствуйте, YuriV, Вы писали:

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


R>>Будьте осмотрительны, используя initializer_list для инициализации. Помните, его элементы всегда копируются, а не перемещаются, даже когда вы наполняете его rvalue значениями:


R>>
R>>struct MovableNonCopyable
R>>{
R>>  MovableNonCopyable() = default;
R>>  MovableNonCopyable(MovableNonCopyable&&) = default;
R>>};
R>>// . . . 
R>>std::vector<MovableNonCopyable> v { MovableNonCopyable(), MovableNonCopyable(), MovableNonCopyable() };
R>>// error: use of deleted function ‘constexpr MovableNonCopyable::MovableNonCopyable(const MovableNonCopyable&)’
R>>


YV>Это std::vector<T> требует:

YV>

YV>T must meet the requirements of CopyAssignable and CopyConstructible.


Да не вопрос, сделай конструктор копирования доступным в классе, ошибка исчезнет. Но выполняться будет копирование, а не перемещение, как, вероятно кто-то ожидает — вот в этом проблема.

YV>а такой код вполне работоспособен:

YV>
YV>MovableNonCopyable v[] = { MovableNonCopyable(), MovableNonCopyable(), MovableNonCopyable() };
YV>


Потому, что это aggregate initialization, с ним все в порядке, в отличие от list initialization. Они хоть по форме и похожи, путать не рекоммендуется
--
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.