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