Тип продвижения перегруженного аргумента функции
Рассмотрим следующий код:
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 пользовательских типа и т.д.)?
Ответы
Ответ 1
По моему пониманию, порядковый тип типа uint64
всегда будет ближе к другому порядковому типу типа longword
, чем a record
. Период.
Расстояние "ближе" не относится к "встроенным" или "обычным" типам. Вы сравниваете яблоки и апельсины.
В компиляторе записи и ординалы представляют собой два разных семейства. Тот факт, что вы можете определить неявное преобразование, никогда не будет способствовать тому, чтобы record
стал порядковым типом.
В результате "встроенный" string
всегда будет иметь меньшее сходство с integer
, чем новый порядковый тип, например:
type TMyInteger64 = type Int46;
Здесь этот тип TMyInteger64
будет "ближе", чем встроенный тип string
.
Как только вы определите a record
, он будет иметь сродства с другими record
, а не с порядковыми типами.