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.

Reply via email to