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