DIP 1016--ref T accepts r-values--Formal Assessment
Nicholas Wilson
iamthewilsonator at hotmail.com
Thu Jan 24 09:04:41 UTC 2019
On Thursday, 24 January 2019 at 07:18:58 UTC, Mike Parker wrote:
> Walter and Andrei have declined to accept DIP 1016, "ref T
> accepts r-values", on the grounds that it has two fundamental
> flaws that would open holes in the language. They are not
> opposed to the feature in principle and suggested that a
> proposal that closes those holes and covers all the bases will
> have a higher chance of getting accepted.
>
> You can read a summary of the Formal Assessment at the bottom
> of the document:
>
> https://github.com/dlang/DIPs/blob/master/DIPs/rejected/DIP1016.md
> The second problem is the use of := (which the DIP Author
> defines as representing "the initial construction, and not a
> copy operation as would be expected if this code were written
> with an = expression"). This approach shows its deficiencies in
> the multiple arguments case; if the first constructor throws an
> exception, all remaining values will be destroyed in the void
> state as they never have the chance to become initialized.
Although not specified by the DIP, I think this could be easily
remedied by saying that the order of construction is the same as
if the temporaries were not bound to ref, i.e.
---
struct A {~this();} struct B{ ~this();}
A a();
B b();
void f(A a, B b);
void g(ref A a, ref B b);
f(a(),b()); //(1)
g(a(),b()); //(2)
---
and a() or b() may throw (and are pure), that (1) and (2) exhibit
the same exception/destructor semantics.
Which is what I would expect to happen under no given
specification (although specifying it is a good idea!). To put it
another way, they should be constructed in place in the order
they are used, and given they are a temporary, they can only be
used once.
More information about the Digitalmars-d-announce
mailing list