static bool QObject::disconnect(const QMetaObject::Connection &connection)
此方法旨在断开现有Connection对象以修改它.那么为什么函数参数被声明为const引用呢?
在源代码实现(qtbase/src/corelib/kernel/qobject.cpp)中,您可以找到不可避免的const_cast:
const_cast<QMetaObject::Connection &>(connection).d_ptr = 0;
Run Code Online (Sandbox Code Playgroud)
将函数参数标记为const函数的目的是修改它的优点是什么?
原因纯粹是历史原因。正如最初设想的那样,该 API 被认为不需要Connection在断开实例连接时修改实例。事实证明,这确实是考虑不周的。二进制兼容性原因迫使 API 保持不变。参数类型中的 const 删除和字段类型中的可变添加都不是二进制兼容的更改。相关摘录:
您不能 [...] 对于现有类 [...] 对于任何类型的现有函数 [...] 更改其签名。这包括 [...] 更改参数列表中参数的任何类型,包括更改 const/易失性限定符 [...]
您不能[...]对于非静态成员[...]更改成员的类型,符号类型除外[...]
新断开 API 的原始实现没有修改d_ptr. Connection当实例的寿命超过发送者对象时,这会导致内存泄漏。该修复必须修改 的Connection非可变字段,这const_cast是唯一的方法。
最初的实现是从 2011 年开始的,早于 Qt 5 发布,但修复进入了 2012 年的 Qt 5.0.1:此时必须保留二进制兼容性。