为什么QObject :: disconnect(const QMetaObject :: Connection& connection)需要const参数来修改它?

时间:2018-06-08 00:22:42

标签: c++ qt

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有什么好处?

1 个答案:

答案 0 :(得分:1)

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

  

您不能[...]对于现有的类[...]对于任何类型的现有函数[...]更改其签名。   这包括[...]更改参数列表中任何类型的参数,包括更改const / volatile限定符[...]

     

您不能[...]对于非静态成员[...]更改成员的类型,除了签名[...]

新的断开连接API的

The original implementation未修改d_ptr。当Connection实例超过发件人对象时,这会导致内存泄漏。 The fix必须修改Connection的不可变字段,而const_cast是唯一可行的方法。

最初的实现是从2011年开始的,并且早于Qt 5发布,但修复程序在2012年进入Qt 5.0.1:此时必须保留二进制兼容性。