On Friday, 13 March 2015 at 15:21:42 UTC, Zach the Mystic wrote:
On Wednesday, 11 March 2015 at 20:33:07 UTC, 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?
Are the suggested changes also related to the possibility of
making `ref` a type?
Are there plans to do this? I remember Walter suggested `ref` for
non-parameters, i.e. local variables, but as a storage class, not
a type modifier.