Бага или фича?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Аватара пользователя
beria
постоялец
Сообщения: 130
Зарегистрирован: 29.09.2016 07:57:13

Бага или фича?

Сообщение beria »

Я на фрипасе работаю недавно, но вот уже несколько раз сталкивался с тем что подобный вполне реальный код..

Код: Выделить всё

TListHTML = class(TList)
      function Get(Index: integer): THTML; overload;
      function Get(Index: integer): PHTML; overload;
   end;
 

или просто

Код: Выделить всё

TListHTML = class(TList)
      function Get(Index: integer): THTML;
      function Get(Index: integer): PHTML;
   end;

 

прекрасно в модуле компилируется, абсолютно правильно редактор Лазаруса дает подсказку по параметрам вызова (тип возвращаемого значения совершенно разный и разного размера)..... но используется только и та функция, которая стоит первой, а вторую как-бы линковщик вообще не видит как факт, хотя внутренние имена, что можно подсмотреть, им даются разные.
Awkward
новенький
Сообщения: 53
Зарегистрирован: 18.01.2017 23:06:47

Сообщение Awkward »

Скорее, баг, ибо компилятор должен был ругаться. Мне казалось, перегруженные функции должны отличаться типами параметров, а не только лишь возвращаемым значением, которое может быть проигнорировано. Ну, т.е. вполне логично, что код не работает как ожидаемо. Неясно, почему ошибка компиляции не выдаётся при этом.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

ЕМНИП перегружать по типу результата нельзя
фича
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

багофича
sts
энтузиаст
Сообщения: 519
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

В делфе нельзя, не компилится, хотя это эквивалентно:

Код: Выделить всё

   TListHTML = class(TList)
      procedure Get(Index: integer; out Result: THTML); overload;
      procedure Get(Index: integer; out Result: PHTML); overload;
   end;

и работает.
подозреваю вызывается одна потому что срабатывает сахар связанный с обработкой переменных типа P = ^T,
ранее надо было обязательно писать P^:= T, а сахар позволил не писать ^, и работает все нормально чисто случайно, не возникала ситуация когда надо передать именно указатель а не содержимое, пошукайте в эту сторону.
Ответить