Почему QObject :: disconnect (const QMetaObject :: Connection & connection) принимает аргумент const с намерением изменить его? - PullRequest
0 голосов
/ 08 июня 2018

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 голосов
/ 12 июня 2018

Причины чисто исторические.Считалось, что API, как изначально задумывалось, не нужно изменять экземпляр Connection при его отключении.Это оказалось действительно непродуманным.Причины двоичной совместимости вынудили API остаться без изменений.Ни удаление const в типе аргумента, ни добавление mutable в типе поля не будет бинарно-совместимыми изменениями .Соответствующий отрывок:

Вы не можете [...] Для существующих классов [...] Для существующих функций любого типа [...] изменить свою подпись.Это включает [...] изменение любого из типов аргументов в списке параметров, в том числе изменение константных / volatile квалификаторов [...]

Вы не можете [...] для нестатических членов[...] изменить тип члена, за исключением подписи [...]

Исходная реализация нового API отключения не изменила d_ptr,Это вызвало утечку памяти, когда экземпляр Connection пережил объект отправителя. Исправление должно было изменить неизменяемые поля Connection, и этот const_cast был единственным способом сделать это.

Первоначальная реализация от 2011 года, и предшествуетВыпуск Qt 5, но исправление вошло в Qt 5.0.1 в 2012 году: в этот момент двоичная совместимость должна была быть сохранена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...