Рассмотрим следующий код:продвижение Тип аргумента перегруженной функции в
program Promote;
{$APPTYPE CONSOLE}
uses
SysUtils;
{$HINTS OFF}
type
MyWord = record
FValue: LongWord;
class operator Implicit(AValue: LongWord): MyWord;
end;
class operator MyWord.Implicit(AValue: LongWord): MyWord;
begin
Result.FValue:= AValue;
end;
procedure Test(AValue: MyWord); overload;
begin
Writeln('MyWord');
end;
procedure Test(AValue: UInt64); overload;
begin
Writeln('UInt64');
end;
var
LW: LongWord;
begin
Test(LW);
Readln;
end.
Когда я запускаю его (Delphi XE) Я вижу, что компилятор поддерживает LongWord
параметр UInt64
(встроенный тип), не MyWord
(пользовательский тип).
Можно ли предположить, что компилятор Delphi всегда поддерживает встроенный тип для встроенного типа, если такая продвижение реализовано в самом компиляторе?
В целом, какие правила контролируют тип продвижения в таких ситуациях (скажем, у нас есть 2 встроенных типа или 2 пользовательских типа и т. Д.)?
Удачи вам в этом. Документация не существует. Лучшее, что вы можете сделать, это обратить вспять. –
Я бы ** ожидал **, что это всегда ** ближайший ** тип –
@Sir. Это легко записать, но без точного определения ближайшего, что это значит. Я нахожу, что это действительно расстраивает то, что правила разрешения перегрузки настолько неадекватно документированы. –