Теперь, когда я думаю об этом, может быть, абсолютно необходимо иметь возвращаемое значение в другом пространстве памяти и скопировать его обратно в тот, который назначен.
Я имею в виду случаи, когда возвращаемое значение может потребоваться перераспределить, как, например, вызов функции, которая принимает параметр TAilmentP с байтовым значением ... Я не думаю, что вы можете напрямую назначить параметры функции, поскольку она еще не была создана, и исправление, нарушающее нормальный и установленный способ генерации вызовов функций в ассемблере (т. е. попытка получить доступ к полям параметра до его создания, - нет-нет, поэтому вам придется до этого создайте этот параметр, затем назначьте ему то, что вы должны назначить ВНЕ конструктора, а затем вызовите функцию в ассемблере).
Это особенно верно и очевидно для других операторов (с помощью которых вы можете оценивать выражения и, следовательно, создавать временные объекты), но не так много, поскольку вы думаете, что это похоже на оператор присваивания в других языках (например, в C ++ (который может быть членом экземпляра), но на самом деле это намного больше, чем это - это также конструктор.
Например
procedure ShowAilmentName (Ailment: TAilmentP);
begin
ShowMessage (Ailment.Name);
end;
[...]
begin
ShowAilmentName (5);
end.
Да, неявный оператор тоже может это делать, что довольно круто. : D
В этом случае я думаю, что 5, как и любой другой байт, будет преобразован в TAilmentP (как при создании нового объекта TAilmentP на основе этого байта) с заданным неявным оператором, а затем объект будет скопирован побайтно в Параметр Ailment, затем вводится тело функции, выполняет свою работу и при возврате временный объект TAilmentP, полученный в результате преобразования, уничтожается.
Это еще более очевидно, если Ailment будет const, поскольку он должен быть ссылочным, а также константным (без изменения после вызова функции).
В C ++ оператор присваивания не имеет отношения к вызовам функций. Вместо этого можно было бы использовать конструктор для TAilmentP, который принимает параметр Byte. То же самое можно сделать в Delphi, и я подозреваю, что он будет иметь приоритет над неявным оператором, однако, что не поддерживает C ++, но делает Delphi, так это имеет понижающее преобразование в примитивные типы (Byte, Integer и т. Д.), Так как операторы перегружены с использованием операторов класса. Таким образом, такая процедура, как «процедура ShowAilmentName (Number: Byte);» никогда не сможет принять вызов типа «ShowAilmentName (SomeAilment)» в C ++, но в Delphi это возможно.
Итак, я полагаю, что это побочный эффект от оператора Implicit, также похожего на конструктор, и это необходимо, поскольку записи не могут иметь прототипов (таким образом, вы не можете преобразовать как один путь, так и другой между двумя записями, просто используя конструкторы).
Кто-нибудь еще думает, что это может быть причиной?