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

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

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

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

Сообщение beria » 03.02.2017 12:11:25

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

Код: Выделить всё
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;


прекрасно в модуле компилируется, абсолютно правильно редактор Лазаруса дает подсказку по параметрам вызова (тип возвращаемого значения совершенно разный и разного размера)..... но используется только и та функция, которая стоит первой, а вторую как-бы линковщик вообще не видит как факт, хотя внутренние имена, что можно подсмотреть, им даются разные.
Аватара пользователя
beria
постоялец
 
Сообщения: 130
Зарегистрирован: 29.09.2016 08:57:13

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

Сообщение Awkward » 03.02.2017 12:27:00

Скорее, баг, ибо компилятор должен был ругаться. Мне казалось, перегруженные функции должны отличаться типами параметров, а не только лишь возвращаемым значением, которое может быть проигнорировано. Ну, т.е. вполне логично, что код не работает как ожидаемо. Неясно, почему ошибка компиляции не выдаётся при этом.
Awkward
новенький
 
Сообщения: 43
Зарегистрирован: 19.01.2017 00:06:47

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

Сообщение zub » 03.02.2017 15:10:59

ЕМНИП перегружать по типу результата нельзя
фича
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение hinst » 03.02.2017 15:58:37

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

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

Сообщение sts » 03.02.2017 16:48:16

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

Код: Выделить всё
   TListHTML = class(TList)
      procedure Get(Index: integer; out Result: THTML); overload;
      procedure Get(Index: integer; out Result: PHTML); overload;
   end;

и работает.
подозреваю вызывается одна потому что срабатывает сахар связанный с обработкой переменных типа P = ^T,
ранее надо было обязательно писать P^:= T, а сахар позволил не писать ^, и работает все нормально чисто случайно, не возникала ситуация когда надо передать именно указатель а не содержимое, пошукайте в эту сторону.
sts
постоялец
 
Сообщения: 406
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

Рейтинг@Mail.ru