DIP 1016--ref T accepts r-values--Formal Assessment

bitwise bitwise.pvt at gmail.com
Mon Feb 4 17:09:25 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.


> fun(10)
> ==>
> {
>   T __temp0 = void;
>   fun(__temp0 := 10);
> }

> the rewrite is from an expression to a statement, rendering it 
> invalid.

> 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.

> They say that with the current semantics, this function only 
> operates on long values as it should. With the proposed 
> semantics, the call will accept all shared integral types.

I think this solves all of the above:

fun(10);
==>
(int __temp0){ (return)? fun( __temp0 ); }(10);

-The expression/statement issue is solved by the closure
-The initialization issue created by the ":=" approach is not 
present here
-For this rewrite, 'T' is the type of the rvalue argument, not 
the type of the function parameter. This prevents undesired 
implicit conversions.


More information about the Digitalmars-d-announce mailing list