Классы контейнеров Qt QList<T>
, QVector<T>
и т.д. требуют, чтобы их типы элементов были скопируемыми. Начиная с С++ 11, контейнеры STL требуют, чтобы их тип элемента был только для копирования или перемещения. Почему контейнеры Qt не поддерживают типы элементов только для перемещения?
Почему классы контейнеров Qt не допускают перемещаемые, не скопируемые типы элементов?
Ответ 1
Ошибка Qt # 54685 имеет явное подтверждение от разработчиков Qt, что типы перемещения не поддерживаются (и никогда не будут) из-за Qt контейнерами принцип неявного обмена.
Когда вы копируете один контейнер Qt в другой, вы не делаете глубокую копию - контейнеры совместно используют свое содержимое внутри. Только когда вызывающая функция вызывается в контейнере, она отделяется, создавая собственную локальную копию содержимого. Это позволяет передавать контейнеры Qt через сигналы и слоты (что обязательно по значению) без снижения производительности.
Это, конечно, было бы невозможно, если содержащийся тип - только для перемещения. И способность пропускать контейнеры по значению (без копирования их содержимого) имеет основополагающее значение для механизма метаобъектов Qt, поэтому я не думаю, что его можно было бы перепроектировать. API-интерфейсы Qt полагаются на неявное совместное использование и пропускают контейнеры по значению, даже если контейнер с переносом будет передаваться по ссылке, поэтому нет простого выхода.