15

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

4

1 回答 1

17

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

当您将一个 Qt 容器复制到另一个容器时,您并不是在进行深度复制——容器在内部共享它们的内容。只有在容器上调用修改函数时,它才会分离,创建自己的内容本地副本。这允许 Qt 容器通过信号和槽(这必然是按值)传递,而不会降低性能。

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

于 2015-09-15T11:31:55.647 回答