为什么 Qt 的容器 类 不允许可移动的、不可复制的元素类型?
Why do Qt's container classes not allow movable, non-copyable element types?
Qt 容器类 QList<T>
、QVector<T>
等要求它们的元素类型是可复制的。从 C++11 开始,STL 容器要求它们的元素类型只能是可复制或可移动的。为什么 Qt 容器不支持只移动元素类型?
Qt bug #54685 已得到 Qt 开发人员的明确确认,由于 Qt 容器的 隐式共享原则,不支持(并且永远不会)支持仅移动类型。
当您将一个 Qt 容器复制到另一个 Qt 容器时,您并不是在进行深度复制——容器在内部共享它们的内容。只有当在容器上调用修改函数时,它才会分离,创建自己的内容本地副本。这允许 Qt 容器通过信号和插槽(必须按值)传递,而不会导致性能直线下降。
当包含的类型是只能移动时,这当然是不可能的。并且按值传递容器(不复制其内容)的能力是 Qt 元对象机制的基础,因此我不认为它可以重新设计。 Qt API 依赖于隐式共享并按值传递容器,即使只能移动的容器将通过引用传递,因此没有简单的出路。
Qt 容器类 QList<T>
、QVector<T>
等要求它们的元素类型是可复制的。从 C++11 开始,STL 容器要求它们的元素类型只能是可复制或可移动的。为什么 Qt 容器不支持只移动元素类型?
Qt bug #54685 已得到 Qt 开发人员的明确确认,由于 Qt 容器的 隐式共享原则,不支持(并且永远不会)支持仅移动类型。
当您将一个 Qt 容器复制到另一个 Qt 容器时,您并不是在进行深度复制——容器在内部共享它们的内容。只有当在容器上调用修改函数时,它才会分离,创建自己的内容本地副本。这允许 Qt 容器通过信号和插槽(必须按值)传递,而不会导致性能直线下降。
当包含的类型是只能移动时,这当然是不可能的。并且按值传递容器(不复制其内容)的能力是 Qt 元对象机制的基础,因此我不认为它可以重新设计。 Qt API 依赖于隐式共享并按值传递容器,即使只能移动的容器将通过引用传递,因此没有简单的出路。