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;
如果函数的目的是修改函数参数,那么将函数参数标记为const
的优点是什么?
发布于 2018-06-11 13:57:28
原因纯属历史原因。最初设想的API被认为不需要在断开连接时修改Connection
实例。事实证明,这确实是错误的。二进制兼容性的原因迫使API保持不变。参数类型中的const-删除和字段类型中的可变加法都不会是二进制兼容的更改。有关摘录:
你不能..。对于现有的课程..。对于任何类型的现有功能..。改变它的签名。这包括..。更改参数列表中任何类型的参数,包括更改const/挥发性限定符. 你不能..。对于非静止的成员.改变成员的类型,除了签名.
新断开API的最初的实施没有修改d_ptr
。当Connection
实例超过发送方对象时,这会导致内存泄漏。修复必须修改Connection
的不可变字段,而这个const_cast
是唯一的方法。
最初的实现是从2011年开始的,在Qt5发布之前就已经实现了,但是在2012年Qt5.0.1中出现了修复:此时必须保留二进制兼容性。
https://stackoverflow.com/questions/50751778
复制