Smart references

Rikki Cattermole via Digitalmars-d digitalmars-d at puremagic.com
Wed Mar 11 21:03:42 PDT 2015


On 12/03/2015 9:33 a.m., Andrei Alexandrescu wrote:
> I'm investigating D's ability to define and use smart references. Per
> the skeleton at http://dpaste.dzfl.pl/9d752b1e9b4e, lines:
>
> #6: You can't default-initialize a ref.
>
> #7: You can't copy a ref - copying should mean copying the object itself.
>
> #9: Per this example I'm hooking a reference with an Owner. The
> reference hooks calls to opAddRef and opRelease in the owner.
>
> #23: Assigning the reference really assigns the referred.
>
> #28: A reference is a subtype of ref T. Most operations against the
> reference will be automatically forwarded to the underlying object, by
> reference ("ref" is important here).
>
> As unittests show, things work quite nicely. There are a few things that
> don't:
>
> #70: Attempting to copy a reference fails on account of the disabled
> postblit. There should be a way to tell the compiler to automatically
> invoke alias this and create a copy of that guy.
>
> #81: Moving from a reference works by moving the Ref object. There
> should be a way to tell the compiler that moving should really move the
> payload around.
>
> There are a couple other issues not represented in the unittest, for
> example related to template deduction. In a perfect world, Ref would
> masquerade (aside from having a different layout, ctor, and dtor) as an
> lvalue of type T.
>
> But in fact I think solving the matters above would go a long way toward
> making smart references nicely usable. Although my example is centered
> on reference counting an owner, there are other uses of smart
> references. Are all these worth changing the language?
>
>
> Andrei

My modified version:
http://dpaste.dzfl.pl/33d4e44c7167

Difference:
Added opNewRef to owner which returns a new copy of itself. Minice the 
current state of the reference counting.

I also changed the == in the static asserts that don't work to :. This 
does work and I argue for alias this, this is correct behavior.

Of course this would break wards compatibility a little bit, so maybe a 
pragma to tell the compiler to include int in ==?

pragma(aliasIsThis)
struct Ref(T, Owner) {
     ...



More information about the Digitalmars-d mailing list