Smart references

Andrei Alexandrescu via Digitalmars-d digitalmars-d at puremagic.com
Wed Mar 11 13:33:06 PDT 2015


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


More information about the Digitalmars-d mailing list