Здравствуйте, 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. Они хоть по форме и похожи, путать не рекоммендуется