Oleg N. Cher писал(а):
Просто для удобства и более чистого синтаксиса в КП разрешается опускать ^
Так что это операция "копирование строк по указателю".
Возражаю.
Language Report 8.1 писал(а):
If p designates a pointer, p^ denotes the variable which is referenced by p. The designators p^.f, p^[e], and p^$ may be abbreviated as p.f, p[e], and p$, i.e., record, array, and string selectors imply dereferencing. Dereferencing is also implied if a pointer is assigned to a variable of a record or array type (Ch. 9.1), if a pointer is used as actual parameter for a formal parameter of a record or array type (Ch. 10.1), or if a pointer is used as argument of the standard procedure LEN (Ch. 10.3).
Это - закрытый (исчерпывающий) список случаев, когда разыменование подразумевается и может быть опущено. Приведенный мной пример не входит в этот список. В левой части оператора присваивания указатели не разыменовываются по умолчанию.
Если строго истолковывать, то получается... ничего не получается: невозможно присвоить массив t^ указателю s. Невозможно присвоить строку "Почему это работает?!" указателю s.
Документ Platform-specific issues, который вводит понятие untagged, как я понимаю, никак не переопределяет правила совместимости по присваиванию.
Так что по-прежнему открыт вопрос: почему это работает - где это определено (кроме самого текста компилятора)?
P.S. Эта магия используется в (Lin)HostDialog.ForkOfChild, которую мы с Иван Андреичем составляли.