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
有什么好处?
答案 0 :(得分:1)
原因纯粹是历史性的。最初构想的API被认为在断开连接时不需要修改Connection
实例。事实证明这确实是错误的。二进制兼容性原因迫使API保持不变。参数类型中的const-removal和字段类型中的可变加法都不是binary-compatible changes。相关摘录:
新的断开连接API的您不能[...]对于现有的类[...]对于任何类型的现有函数[...]更改其签名。 这包括[...]更改参数列表中任何类型的参数,包括更改const / volatile限定符[...]
您不能[...]对于非静态成员[...]更改成员的类型,除了签名[...]
The original implementation未修改d_ptr
。当Connection
实例超过发件人对象时,这会导致内存泄漏。 The fix必须修改Connection
的不可变字段,而const_cast
是唯一可行的方法。
最初的实现是从2011年开始的,并且早于Qt 5发布,但修复程序在2012年进入Qt 5.0.1:此时必须保留二进制兼容性。