Подтвердить что ты не робот

Тип продвижения перегруженного аргумента функции

Рассмотрим следующий код:

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 пользовательских типа и т.д.)?

4b9b3361

Ответ 1

По моему пониманию, порядковый тип типа uint64 всегда будет ближе к другому порядковому типу типа longword, чем a record. Период.

Расстояние "ближе" не относится к "встроенным" или "обычным" типам. Вы сравниваете яблоки и апельсины.

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

В результате "встроенный" string всегда будет иметь меньшее сходство с integer, чем новый порядковый тип, например:

type TMyInteger64 = type Int46;

Здесь этот тип TMyInteger64 будет "ближе", чем встроенный тип string.

Как только вы определите a record, он будет иметь сродства с другими record, а не с порядковыми типами.