An important potential change to the language: transitory ref
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Fri Mar 19 21:15:50 PDT 2010
On 03/19/2010 10:52 PM, Michel Fortin wrote:
> On 2010-03-19 22:56:59 -0400, Andrei Alexandrescu
> <SeeWebsiteForEmail at erdani.org> said:
>
>> So I was thinking of the following: how about still returning a
>> reference, but define a rule in the language that references can't
>> escape - you can't take their address and squirrel it away; the only
>> thing you can do is use them right on the spot or pass them down to
>> functions.
>
> Can functions return the reference, or a reference to a part of the
> original referenced value?
I see two possible approaches (a) disallow that, which I think would be
irregular, and (b) conservatively assume that that happens on the call side.
There is one other problem that I haven't mentioned. Consider the code:
void fun(ref int a, int b) {
a = b;
}
Array!int arr;
arr.resize(5);
fun(arr[4], (arr.resize(10000), 42));
The purpose of restricting ref was to allow Array to entirely
encapsulate its memory allocation, i.e. allow Array to use malloc and
free without fearing that someone still holds a dangling pointer in there.
In the code above, however, evaluation will first take the address of
arr[4] and _then_ call arr.resize (which may trigger reallocation). As a
consequence, by the time fun sees the ref, it's already dangling. I
don't know how to solve this.
Andrei
More information about the Digitalmars-d
mailing list