Подтвердить что ты не робот

Почему классы контейнеров Qt не допускают перемещаемые, не скопируемые типы элементов?

Классы контейнеров Qt QList<T>, QVector<T> и т.д. требуют, чтобы их типы элементов были скопируемыми. Начиная с С++ 11, контейнеры STL требуют, чтобы их тип элемента был только для копирования или перемещения. Почему контейнеры Qt не поддерживают типы элементов только для перемещения?

4b9b3361

Ответ 1

Ошибка Qt # 54685 имеет явное подтверждение от разработчиков Qt, что типы перемещения не поддерживаются (и никогда не будут) из-за Qt контейнерами принцип неявного обмена.

Когда вы копируете один контейнер Qt в другой, вы не делаете глубокую копию - контейнеры совместно используют свое содержимое внутри. Только когда вызывающая функция вызывается в контейнере, она отделяется, создавая собственную локальную копию содержимого. Это позволяет передавать контейнеры Qt через сигналы и слоты (что обязательно по значению) без снижения производительности.

Это, конечно, было бы невозможно, если содержащийся тип - только для перемещения. И способность пропускать контейнеры по значению (без копирования их содержимого) имеет основополагающее значение для механизма метаобъектов Qt, поэтому я не думаю, что его можно было бы перепроектировать. API-интерфейсы Qt полагаются на неявное совместное использование и пропускают контейнеры по значению, даже если контейнер с переносом будет передаваться по ссылке, поэтому нет простого выхода.