2015-01-31 1 views
13

Рассмотрим следующий код:продвижение Тип аргумента перегруженной функции в

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

+0

Удачи вам в этом. Документация не существует. Лучшее, что вы можете сделать, это обратить вспять. –

+0

Я бы ** ожидал **, что это всегда ** ближайший ** тип –

+4

@Sir. Это легко записать, но без точного определения ближайшего, что это значит. Я нахожу, что это действительно расстраивает то, что правила разрешения перегрузки настолько неадекватно документированы. –

ответ

1

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

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

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

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

type TMyInteger64 = type Int46; 

Вот этот TMyInteger64 тип будет «ближе», чем встроенный -in string type.

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