首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么QObject::disconnect(::connection &connection)采用const参数并打算修改它?

为什么QObject::disconnect(::connection &connection)采用const参数并打算修改它?
EN

Stack Overflow用户
提问于 2018-06-08 00:22:42
回答 1查看 252关注 0票数 5

static bool QObject::disconnect(const QMetaObject::Connection &connection)

此方法旨在断开现有Connection对象的连接,以便对其进行修改。那么为什么函数参数被声明为const引用呢?

在源代码实现(qtbase/src/corelib/kernel/qobject.cpp)中,可以找到不可避免的const_cast

代码语言:javascript
运行
复制
const_cast<QMetaObject::Connection &>(connection).d_ptr = 0;

如果函数的目的是修改函数参数,那么将函数参数标记为const的优点是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-11 21:57:28

原因纯属历史原因。最初设想的API被认为不需要在断开连接时修改Connection实例。事实证明,这确实是错误的。二进制兼容性的原因迫使API保持不变。参数类型中的const-删除和字段类型中的可变加法都不会是二进制兼容的更改。有关摘录:

你不能..。对于现有的课程..。对于任何类型的现有功能..。改变它的签名。这包括..。更改参数列表中任何类型的参数,包括更改const/挥发性限定符. 你不能..。对于非静止的成员.改变成员的类型,除了签名.

新断开API的最初的实施没有修改d_ptr。当Connection实例超过发送方对象时,这会导致内存泄漏。修复必须修改Connection的不可变字段,而这个const_cast是唯一的方法。

最初的实现是从2011年开始的,在Qt5发布之前就已经实现了,但是在2012年Qt5.0.1中出现了修复:此时必须保留二进制兼容性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50751778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档