c++ - 为什么 Qt 不支持只 move QList?

标签 c++ qt containers move-semantics

尽管Why do Qt's container classes not allow movable, non-copyable element types?,我还是想再问一遍这个问题.我已阅读 QtCore 维护者 Thiago 的以下声明(链接自链接的 Stackoverflow 问题的答案):

Will not be implemented, ever. Copyability is a mandatory requirement due to implicit sharing.

我不理解这个声明:可复制性隐式共享的强制性要求,我理解那部分。但是为什么隐式共享是不可复制的要求 QList<T>

QList已经有了 move 构造函数和 move 赋值运算符,所以假设构建一个 QList<T>来自另一个临时QList<T>不会应用隐式共享,但会 move 底层 d 指针,在什么情况下仅复制/分配临时/右值时会出现隐式共享 QList在附近吗?

最佳答案

这可能是因为 QLists 只被标记为可重入的,而不是线程安全的(definition)。

我没有看过源代码,但猜测维护线程安全 QList 的开销超过了支持普通用户的成本(当然这只是假借口 :P)。

当 T 是指针或引用时,这可能意味着在更改列表中的对象时必须同步多个内存空间 - 这似乎超出了 Qt 框架的范围。我还可以想象,如果主线程中有一些工厂实例化对象,这对于 Qt 来说会变得复杂。或者当一个对象拥有对线程或回调的引用/指针时。

可能不应该回答您的任何问题,但这比评论要长。

关于c++ - 为什么 Qt 不支持只 move QList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44217527/

相关文章:

c++ - 具有不同顺序或变量的模板类(颜色/像素类)

c++ - 使用 Qt 在 OS X/Mac 上构建 C++ 库

c++ - 为什么不在 C++ 容器中实现 contains 函数?

python - Pyqt 超链接不启动外部应用程序

swift - 如何创建自定义容器 View Controller 并根据用户选择交换某些部分?

sql-server - 通过名称从另一个容器连接到SQL Server容器

c++ - 没有 Dijkstra 的最短路径

c++ - 使用 MFC 在 C++ 中将图像插入到 RTF 数据中

c++ - 将二进制文件读入 unsigned char vector 缓冲区

c++ - 从 QMap 中删除所有值