Причины чисто исторические.Считалось, что API, как изначально задумывалось, не нужно изменять экземпляр Connection
при его отключении.Это оказалось действительно непродуманным.Причины двоичной совместимости вынудили API остаться без изменений.Ни удаление const в типе аргумента, ни добавление mutable в типе поля не будет бинарно-совместимыми изменениями .Соответствующий отрывок:
Вы не можете [...] Для существующих классов [...] Для существующих функций любого типа [...] изменить свою подпись.Это включает [...] изменение любого из типов аргументов в списке параметров, в том числе изменение константных / volatile квалификаторов [...]
Вы не можете [...] для нестатических членов[...] изменить тип члена, за исключением подписи [...]
Исходная реализация нового API отключения не изменила d_ptr
,Это вызвало утечку памяти, когда экземпляр Connection
пережил объект отправителя. Исправление должно было изменить неизменяемые поля Connection
, и этот const_cast
был единственным способом сделать это.
Первоначальная реализация от 2011 года, и предшествуетВыпуск Qt 5, но исправление вошло в Qt 5.0.1 в 2012 году: в этот момент двоичная совместимость должна была быть сохранена.