Short list with things to finish for D2
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Thu Nov 19 12:40:07 PST 2009
dsimcha wrote:
> == Quote from Andrei Alexandrescu (SeeWebsiteForEmail at erdani.org)'s article
>>> 2. After thinking about this some more, the big issue I see is ref opIndex. We
>>> can either:
>>> a. Disallow it for both UniqueArray and ArrayBuilder.
>>> b. Allow it for both UniqueArray and ArrayBuilder and accept
>>> that a sufficiently dumb programmer can invalidate the
>>> guarantees of UniqueArray by taking the address of one of the
>>> elements and saving it somewhere. Probably a bad idea, since
>>> assumeUnique() already works for the careful programmer, and
>>> UniqueArray is supposed to provide ironclad guarantees.
>>> c. Don't define opIndex in the abstract base class at all, thus
>>> making Array almost useless as an abstract base class.
>> Welcome to my demons :o).
>> One possibility that I thought of for a long time would be to disallow
>> taking the address of a ref. That reduces the scope of the problem but
>> doesn't eliminate it:
>> void main() {
>> auto a = new UniqueArray(10);
>> fun(a[0], a);
>> }
>> void fun(ref int a, UniqueArray b)
>> {
>> auto imm = b.toImmutable();
>> // here a is a mutable alias into an immutable array!!!
>> }
>> So that doesn't work, but I thought I'd mention it :o).
>> Another possibility is to expose opIndex to return by value and also
>> opIndexAssign that sets the value. That would be a no-no in C++ because
>> copying is arbitrarily expensive, but I have a feeling that in D it is
>> sensible to consider and foster that all objects should be defined to be
>> cheap to copy (e.g. refcounting, COW etc.) If we go by the notion that
>> in D we can always assume copy costs are reasonable, this last
>> possibility would work. With the newfangled operators, it would even
>> work beautifully because you can do all sorts of things like a[1] += 4
>> without ever exposing a ref to the user.
>> Andrei
>
> I wonder if it would be feasible to allow overloading on ref vs. non-ref return.
> Technically this would be overloading on return type, but without many of the
> practical problems. If the return value is used as an lvalue, the ref return
> function gets called. If the return value is only used as an rvalue, the non-ref
> function gets called.
>
> This would allow return by value to be defined in the base class and return by
> reference to only be defined in ArrayBuilder.
It has been discussed. Overloading is not necessary - Walter said
defining opIndex and opIndexLvalue and having the compiler call the
appropriate one is possible.
Andrei
More information about the Digitalmars-d
mailing list