[fpc-devel] Question on constref

Ondrej Pokorny lazarus at kluug.net
Thu Feb 2 10:35:25 CET 2023


On 02.02.2023 10:22, Michael Van Canneyt via fpc-devel wrote:
> On Thu, 2 Feb 2023, Ondrej Pokorny via fpc-devel wrote:
>> On 02.02.2023 10:15, Michael Van Canneyt via fpc-devel wrote:
>>> On Thu, 2 Feb 2023, Ondrej Pokorny via fpc-devel wrote:
>>>> I myself cannot think of any real use case of constref other than 
>>>> hacks like the FreeAndNil in recent Delphi versions:
>>>>
>>>> procedure FreeAndNil(const [ref] Obj: TObject);
>>>>
>>>> that needs the ref because it changes it to nil (so is not really a 
>>>> const - it used to be an untyped var). As a result FreeAndNil 
>>>> allows you to happily pass read-only properties to it that are then 
>>>> nilled.
>>>
>>> Which is a clear violation of the concept of Const... :/
>>
>> Exactly.
>
> Probably an ill-advised "fix" to the problem that FreeAndNil accepted 
> an untyped var
> and you could basically pass anything.

Yes. Solving one problem by creating a different one. The best would be 
if the FreeAndNil declaration alternated between constref and untyped 
var between builds. In that case you would be able to hunt both the 
issues :)

Seriously, having a [loose] modifier would be much more useful, IMO:

FreeAndNil(var [loose] Obj: TObject);

That would allow you to pass any TObject descendant.

Ondrej



More information about the fpc-devel mailing list