Похоже, что компилятор Delphi не оценивает параметры записи const, когда "records-with-methods".
Не пытаясь раньше злоупотреблять конст-конвенцией, я был немного удивлен чтобы найти принятый код компилятора следующим образом:
type
TTest = record
Field : String;
procedure Update;
end;
procedure TTest.Update;
begin
Field := Field + '+1';
end;
procedure DoStuff(const t : TTest);
begin
ShowMessage(t.Field);
t.Update;
ShowMessage(t.Field);
end;
Если вы пытаетесь сделать
t.Field:='doh';
в DoStuff f.i., компилятор будет правильно жаловаться, но вам разрешено вызывать методы, которые изменяют запись "const", даже без подсказки или предупреждения. Таким образом, это другое поведение, чем для ссылочных типов (таких как классы или динамические массивы), где допускаются прямые записи полей (поскольку const ограничивает только изменения самого параметра).
Addendum: это позволяет также изменять объявленные константы времени компиляции, как в:
const
cTest : TTest = (Field : '1');
...
cTest.Update; // will show '1' then '1'+'1'
ShowMessage(cTest.Field); // will show '1' (because optimized at compile-time)
Является ли это принятым/документированным поведением? или просто недостаток компилятора?