Qt容器类 QList<T>
, QVector<T>
等要求其元素类型可被复制。自C++11起,STL容器需要其元素类型仅能够被复制或移动。为什么Qt容器不支持仅能移动的元素类型?
Qt容器类 QList<T>
, QVector<T>
等要求其元素类型可被复制。自C++11起,STL容器需要其元素类型仅能够被复制或移动。为什么Qt容器不支持仅能移动的元素类型?
Qt bug #54685得到了Qt开发者的明确确认,因为Qt容器的隐式共享原则,移动只能类型不受支持也永远不会被支持。
当你将一个Qt容器复制到另一个容器时,你并没有进行深拷贝 - 容器在内部共享它们的内容。仅当在容器上调用修改函数时,它才会分离,创建自己的内容本地副本。这使得Qt容器可以通过信号和槽(必须按值传递)传递,而不会导致性能下降。
当然,当包含的类型是移动只能类型时,这将是不可能的。以值方式传递容器(而不复制其内容)的能力对于Qt的元对象机制至关重要,因此我认为它无法重新设计。即使在可以通过引用传递移动只能容器的情况下,Qt API也依赖于隐式共享并按值传递容器,因此没有简单的解决方法。