【问题标题】:Why do Qt's container classes not allow movable, non-copyable element types?为什么 Qt 的容器类不允许可移动、不可复制的元素类型?
【发布时间】:2015-12-11 15:03:19
【问题描述】:

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

【问题讨论】:

  • 也许没有人提议/设计/实施这样的扩展?通常,当某事没有完成时,原因是没有人这样做。
  • Kerrek 所说的 :) 归根结底,允许事情发生的是人。非常欢迎您为 Qt5 实现二进制兼容的 emplacement,或者为 Qt6 实现一个全新的东西。获取一个 Gerrit 帐户,预热你的 git,然后开始 hacking :)

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


【解决方案1】:

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

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

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

【讨论】:

  • 直接连接的槽被调用而不复制。排队连接的处理次数与插槽数一样多(所以 0 次或更多次),但这是一个任意选择。一个人可以只将一份副本保存在一个引用容器中,如果类型是可移动的,这些都可以被移入。我已经关注该代码很长时间了,有一天我可能会开始开发补丁。
  • 显然,具有不可复制元素的容器本身不能被复制。因此,不需要隐式共享。但是,如果元素类型是可复制的,则容器可以保持可复制。因此,现有的功能并没有减少,信号和插槽也像以前一样工作。
  • @RalphTandetzky 问题是当前的 Qt API 和进程依赖隐式共享并按值传递容器,即使没有隐式共享的容器将通过引用传递。跨度>
  • @Angew 感谢您的澄清。这是有道理的。
  • @GuiTeK 谢谢,添加到答案中。
猜你喜欢
  • 2017-02-07
  • 1970-01-01
  • 2021-08-24
  • 2021-12-21
  • 2019-08-09
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多