为什么Qt的容器类不允许可移动的,不可复制的元素类型?

时间:2015-09-15 11:18:23

标签: qt c++11 move-semantics qlist qvector

Qt容器类QList<T>QVector<T>等要求其元素类型可复制。从C ++ 11开始,STL容器要求它们的元素类型只能是可复制的或可移动的。为什么Qt容器不支持仅移动元素类型?

1 个答案:

答案 0 :(得分:15)

Qt bug #54685明确向Qt开发人员确认,由于Qt容器的隐式共享原则,不支持(并且永远不会)支持仅移动类型。

当您将一个Qt容器复制到另一个容器时,您没有进行深层复制 - 容器在内部共享其内容。只有在容器上调用修改函数时才会分离,从而创建自己的内容本地副本。这允许Qt容器通过信号和插槽(必须按值)传递,而不会导致性能骤差。

当包含的类型仅移动时,这当然是不可能的。并且能够按值传递容器(不复制其内容)是Qt的元对象机制的基础,所以我认为它不能重新设计。 Qt API依赖于隐式共享并按值传递容器,即使只有移动容器将通过引用传递,因此没有简单的方法。