gpt4 book ai didi

c++ - 为什么 QObject::disconnect(const QMetaObject::Connection &connection) 采用 const 参数来修改它?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:34 26 4
gpt4 key购买 nike

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

最佳答案

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

You cannot [...] For existing classes [...] For existing functions of any type [...] change its signature. This includes [...] changing any of the types of the arguments in the parameter list, including changing the const/volatile qualifiers [...]

You cannot [...] For non-static members [...] change the type of the member, except for signedness [...]

The original implementation新的断开连接 API 没有修改 d_ptr。当 Connection 实例超过发送者对象时,这会导致内存泄漏。 The fix必须修改 Connection 的非可变字段,而此 const_cast 是唯一的方法。

最初的实现是从 2011 年开始的,早于 Qt 5 发布,但在 2012 年对 Qt 5.0.1 进行了修复:那时必须保留二进制兼容性。

关于c++ - 为什么 QObject::disconnect(const QMetaObject::Connection &connection) 采用 const 参数来修改它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50751778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com