Правильно ли я прочитал N3291 "12.8.(15/11/28) Копирование и перемещение объектов класса class.copy]", что неявно объявленный конструктор перемещения
- выполняет поэлементное перемещение всех нестатических членов данных (вероятно, через соответственно определенные
T(T&&)
- и если какой-либо нестатический член данных не может быть перемещен, неявный конструктор перемещения будет помечен как удаленный и не будет пытаться быть скопированным в качестве «запасного варианта»? (да, перемещение определено для встроенных типов, но на самом деле является копией).
а также переместить-назначить, используя соответствующие T operator=(T&&)
элементов.
Пример:
struct CopyOnly {
CopyOnly();
CopyOnly(const CopyOnly&);
}; // declaring a copy means no implicit move.
struct Question {
std::vector<int> data_;
CopyOnly copyOnly_;
};
Класс Question
- будет иметь неявно объявленный copy-constructor и assign
- будут иметь неявно объявленные move-constructor и move-assign, но они будут
=delete
d, потому что нестатический элемент данныхdata_
только копируемый, но не перемещаемый?
Обновление. Дополнительный вопрос: для Question q;
будет ли работать std::move(q)
? Произойдет ли там откат к копированию? Или неявно объявленный move-ctor заставит компилятор остановиться с ошибкой? Здесь он компилируется.
Обновление 2. Что сгенерирует компилятор для неперемещаемых элементов данных, если я объявлю move-ctor Question(Question&&) =default
? Это тогда откат к их копированию?
copyOnly_
является причиной того, чтоQuestion
не перемещается вместоdata_
, или я пропустил что-то важное? - person pmr   schedule 03.10.2011